从包含文件名的路径获取不带文件名的完整路径


198

有什么内置功能System.IO.Path可以给我文件路径吗?

例如,如果我有一个 string

@“ c:\ webserver \ public \ myCompany \ configs \ promo.xml”,

有什么BCL方法可以给我

“ c:\ webserver \ public \ myCompany \ configs \”?



FWIW:我已经“放弃”了Path对“路径”的处理,我们使用了自己的方法,这些方法对UNC具有更好的期望和统一性(尝试在UNC路径上使用GetDirectoryName)和约定(例如,尾随/)。
user2864740 '02

除非文件或目录存在,否则无法知道promo.xml是以相同名称指定文件还是目录。这可能就是为什么Path.GetDirectoryName()如此简单地实现并且仅截断最后一段,或者如果有则删除尾部斜杠的原因。
亚伯

Answers:


241

Path.GetDirectoryName()...但是您需要知道传递给它的路径确实包含一个文件名;它只是从路径中删除最后一位,无论是文件名还是目录名(实际上都不知道是哪一个)。

您可以先通过测试File.Exists()和/或Directory.Exists()在路径上进行验证,看看是否需要致电Path.GetDirectoryName


2
无需致电File.Exists()。确实,在您查找目录名称的原因是创建目录名称(如果尚不存在)的情况下,它适得其反。
乔恩·汉娜

3
他的示例明确指出了带有文件名的路径。如果这是他正在测试的路径的模式,并且如果这些路径表示现有文件,则检查File.Exists()肯定有用,您是否同意?当然,因为情况可能并非如此,我只是建议他“可以”使用“文件”和/或“目录”上的“存在”方法;显然,适合他的情况。
Andrew Barber 2010年

是的,带有文件名的路径。没有任何内容表明文件存在,因为文件名排在第一位。
乔恩·汉娜

4
就像我说的; 这是一个选项,可能会有所帮助,具体取决于对路径的了解。或根本没有必要。但是,在同一路径上测试File.Exists()和Directory.Exists()是一种快速简便的方法,可以知道存在的路径是文件还是目录。
Andrew Barber 2010年

5
作为快速参考,对于这个问题的冗余和“明显”的对待,您需要包括System.IO此功能。
cregox 2012年

70
Console.WriteLine(Path.GetDirectoryName(@"C:\hello\my\dear\world.hm")); 

2
这是最好的。记住using System.IO;要使用路径方法
语法错误

请注意,这不包括斜杠(平凡的是加一个斜杠)
Mingwei Samuel

51

Path.GetDirectoryName()返回目录名称,因此对于您想要的内容(带有结尾的反斜线字符),可以调用Path.GetDirectoryName(filePath) + Path.DirectorySeparatorChar


12
    string fileAndPath = @"c:\webserver\public\myCompany\configs\promo.xml";

    string currentDirectory = Path.GetDirectoryName(fileAndPath);

    string fullPathOnly = Path.GetFullPath(currentDirectory);

currentDirectory:c:\ webserver \ public \ myCompany \ configs

fullPathOnly:c:\ webserver \ public \ myCompany \ configs


6
请提供有关上述代码如何回答问题的一些信息,以改善此答案。
埃里克·豪恩斯坦

1
Path.GetFullPath返回不带文件名的完整路径。
科比·威廉姆斯

显示输出会有所帮助,我不知道最后两行之间有什么区别。
gakera '18

输出将是-> c:\ webserver \ public \ myCompany \ configs
Kobie Williams,

5

如图所示,使用“ GetParent()”,效果很好。根据需要添加错误检查。

var fn = openFileDialogSapTable.FileName;
var currentPath = Path.GetFullPath( fn );
currentPath = Directory.GetParent(currentPath).FullName;

4

我使用了它,并且效果很好:

string[] filePaths = Directory.GetFiles(Path.GetDirectoryName(dialog.FileName));

foreach (string file in filePaths)
{   
    if (comboBox1.SelectedItem.ToString() == "")
    {
        if (file.Contains("c"))
        {
            comboBox2.Items.Add(Path.GetFileName(file));
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.