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

37

如果我有一个字符串变量,其中包含:

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

我想要获取"foo",请问最佳方法是什么?

6个回答

79

使用:

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

3
根据http://msdn.microsoft.com/en-us/library/system.io.fileinfo.fileinfo.aspx,如果调用方没有所需的权限,FileInfo构造函数可能会引发异常。是否有一种替代方法可以仅解析字符串而无需进行任何IO操作? - GuiSim
@GuiSim:据我所知,没有这样的功能。 - Jon Skeet
10
如果需要完整的目录路径,使用new FileInfo(@"C:\ temp \ temp2 \ foo \ bar.txt") .DirectoryName - Danilo Bargen
3
字符串操作: var dir = _installPath.Split(new[] { Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries).Last(); - Daniel B
1
我相信谷歌有一些顶级机密的Stack Overflow渗透部门,Jon Skeet是他们高度训练的特工之一。除此之外,没有其他方式可以解释在像谷歌这样一个要求很高的公司工作的人有这么多空闲时间来回答问题。 - The Muffin Man

11

虽然我不想和Skeet有任何分歧,但我一直使用

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

我怀疑FileInfo实际上会访问文件系统以获取信息,而GetFileNameWithoutExtension只进行字符串操作-因此,其中一个的性能可能更好。


1
这里的结果有一点不同...我认为你的方法在被问如何获取文件所在目录 "foo" 时返回了 "bar"。 - Kit Roed
9
今天我学到了两件事情...... 仔细阅读问题,并且永远不要和 Skeet 不同意。 - Handleman
2
Path.getDirectoryName难道不正是他想要的吗? - Karl Johan
Path.GetDirectoryName 会返回 "C:\temp\temp2\foo"。 - Martin Clarke
1
你可以使用 Path.GetFileName(Path.GetDirectoryName(filepath)) - 在测试中看起来可以完成任务,并且不会触及文件系统。 - Chris J

8
我认为最简单的解决方案是:
DirectoryInfo dinfo = new DirectoryInfo(path);
string folderName= dinfo.Parent.Name;
以上代码可以获取指定路径下文件夹的名称。

4

在Handleman的建议基础上,您可以这样做:

Path.GetFileName(Path.GetDirectoryName(path))

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

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

另外,查看参考源代码确认了GetFilename不关心传入的路径是文件还是文件夹:它只是进行纯字符串操作。

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

1

这将取决于您如何处理数据,但另一个选项是使用String.Split。

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

这段代码没有检查数组越界异常,但你可以理解其意思。


这在Linux上会失败。 - JensG
Path.DirectorySeparatorChar - Ruudjah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接