从C#中的完整文件路径解析目录名称

时间:2009-03-19 00:37:50

标签: c# file

如果我有一个字符串变量:

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

我希望得到

“foo” 的

这样做的最佳方式是什么?

6 个答案:

答案 0 :(得分:73)

使用:

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

答案 1 :(得分:8)

我不同意Skeet,但我一直都在使用

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

我怀疑FileInfo实际上是触及文件系统来获取它的信息,因为我认为GetFileNameWithoutExtension只是字符串操作 - 所以一个的性能可能更好。

答案 2 :(得分:7)

答案 3 :(得分:3)

根据Handleman的建议,您可以:

Path.GetFileName(Path.GetDirectoryName(path))

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

  

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

另外,查看reference source确认GetFilename并不关心传入的路径是文件还是文件夹:它只是进行纯字符串操作。

答案 4 :(得分:2)

我在循环访问父子目录时有机会

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);

答案 5 :(得分:1)

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

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

这不会检查数组越界异常,但是你明白了。