如果我有一个字符串变量:
"C:\temp\temp2\foo\bar.txt"
我希望得到
“foo” 的
这样做的最佳方式是什么?
答案 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"
这不会检查数组越界异常,但是你明白了。