在C#中从完整的文件pathparsing目录名

如果我有一个stringvariables有:

"C:\temp\temp2\foo\bar.txt" 

我想得到

“富”

做这个的最好方式是什么?

使用:

 new FileInfo(@"C:\temp\temp2\foo\bar.txt").Directory.Name 

我不同意这个Skeet,但我总是用它

 Path.GetFileNameWithoutExtension(@"C:\temp\temp2\foo\bar.txt") 

我怀疑FileInfo实际上触及文件系统来获取它的信息,因为我期望GetFileNameWithoutExtension只是string操作 – 所以一个在另一个上的性能可能会更好。

我认为最简单的解决scheme是

 DirectoryInfo dinfo = new DirectoryInfo(path);

stringfolderName = dinfo.Parent.Name;

基于Handleman的build议,你可以这样做:

 Path.GetFileName(Path.GetDirectoryName(path)) 

这不会触及文件系统(与FileInfo不同),并且会执行所需的操作。 这将与文件夹一起工作,因为如MSDN所说:

返回值:path中最后一个目录字符后面的字符。 如果path的最后一个字符是目录或卷分隔符,则此方法返回String.Empty。 如果path为null,则此方法返回null。

另外,查看参考源确认GetFilename不关心传入的path是文件还是文件夹:它只是在执行纯string操作。

当我通过父子目录循环时,我有一个场合

 string[] years = Directory.GetDirectories(ROOT); foreach (var year in years) { DirectoryInfo info = new DirectoryInfo(year); Console.WriteLine(info.Name); Console.WriteLine(year); //Month directories string[] months = Directory.GetDirectories(year); foreach (var month in months) { Console.WriteLine(month); //Day directories string[] days = Directory.GetDirectories(month); foreach (var day in days) { //checkes the files in the days Console.WriteLine(day); string[] files = Directory.GetFiles(day); foreach (var file in files) { Console.WriteLine(file); } } } } 

使用这一行我只能得到当前的目录名称

 DirectoryInfo info = new DirectoryInfo(year); Console.WriteLine(info.Name); 

这取决于你想如何处理数据,但另一种select是使用String.Split。

 string myStr = @"C:\foo\bar.txt"; string[] paths = myStr.Split('\\'); string dir = paths[paths.Length - 2]; //returns "foo" 

这不检查数组越界例外,但你明白了。