[英]C# Get Directory Names
这是我一直试图用来获取目录名称的一些代码 - 但是它返回完整的文件路径而不是 SUBDIR2 中的所有目录。 我可以做一个拆分字符串,但 Dir 的长度会发生变化
public void Getdire1(string Servername)
{
string[] dirs = Directory.GetDirectories("\\\\"
+ Servername
+ "\\E$\\SUBDIR1\\SUBDIR2\\");
foreach (string item in dirs)
{
MessageBox.Show(item);
}
}
任何人都可以帮忙吗
使用Path.GetDirectoryName(string)
https://docs.microsoft.com/en-us/dotnet/api/system.io.path.getdirectoryname?view=net-5.0
public void Getdire1(string Servername)
{
string[] dirs = Directory.GetDirectories("\\\\" + Servername + "\\E$\\SUBDIR1\\SUBDIR2\\");
foreach (string item in dirs)
{
MessageBox.Show(Path.GetDirectoryName(item));
}
}
请参阅文档中的示例以确保获得所需的 output,例如注意C:\mydir
和C:\mydir\
。
编辑::
在这种情况下,您可以使用Path.GetFileName(string)
但这仅在您的路径不以\
结尾时才有效,例如C:\MyDir
有效,但C:\MyDir\
不会。
您可以像这样使用String.TrimEnd(string)
: "C:\\mydir\\".TrimEnd('\\')
。 我认为Path.GetFileName("C:\\mydir\\".TrimEnd(Path.DirectorySeparatorChar))
会起作用。
甚至这样: Path.GetFileName(Path.GetDirectoryName("C:\\mydir\\"))
但要小心, C:\DirA\DirB\
将导致DirB
但C:\DirA\DirB
将导致DirA
EDIT2: @Stefano Cavion 的答案似乎也很明智,尽管如果我只是想要这个名字,我个人不想实例化整个 class 只是为了从某个字符串中获取目录的名称。 那只是味道。 对于有趣的人,我决定运行一个小型基准测试,看看是否有更好的选择性能明智,而且有趣的是.TrimEnd()
解决方案似乎在某种程度上是最快的。 当然,除非您正在做一些非常特别的事情,否则在此级别上关心性能似乎有点过分了,所以对此持保留态度...
BenchmarkDotNet=v0.13.0, OS=Windows 10.0.17134.677 (1803/April2018Update/Redstone4)
Intel Core i7-7700HQ CPU 2.80GHz (Kaby Lake), 2 CPU, 7 logical and 7 physical cores
.NET SDK=5.0.202
[Host] : .NET Core 3.1.14 (CoreCLR 4.700.21.16201, CoreFX 4.700.21.16208), X64 RyuJIT [AttachedDebugger]
DefaultJob : .NET Core 3.1.14 (CoreCLR 4.700.21.16201, CoreFX 4.700.21.16208), X64 RyuJIT
方法 | 意思是 | 错误 | 标准差 |
---|---|---|---|
使用修剪结束 | 462.2 纳秒 | 17.73 纳秒 | 50.59 纳秒 |
使用GetDirectoryName | 621.2 纳秒 | 18.26 纳秒 | 53.56 纳秒 |
使用GetDirectoryInfo | 1,397.8 纳秒 | 26.71 纳秒 | 65.51 纳秒 |
环境和 .net 核心版本也会产生一些差异,以及我在测试运行时使用计算机。
代码:
public class PathBenchMark
{
public List<string> Paths = new List<string>(new[] { @"C:\MyDir", @"C:\MyDir\", @"C:\A\B", @"C:\A\B\" });
[Benchmark]
public List<string> UseTrimEnd() => Paths.Select(c => Path.GetFileName(c.TrimEnd(Path.DirectorySeparatorChar))).ToList();
[Benchmark]
public List<string> UseGetDirectoryName() => Paths.Select(c => Path.GetFileName(Path.GetDirectoryName(c))).ToList();
[Benchmark]
public List<string> UseGetDirectoryInfo() => Paths.Select(c => new DirectoryInfo(c).Name).ToList();
}
class Program
{
public static void Main()
{
BenchmarkRunner.Run<PathBenchMark>();
}
}
EDIT3:我使用new DirectoryInfo(string).GetDirectories(string)
运行了另一个基准测试。 我还编辑了UseGetDirectoryName
案例,因为Directory.GetDirectories()
返回完整路径而没有尾随\
这将返回错误的目录...即我从现在开始使用DirectoryInfo
或TrimEnd()
因为我不想犯同样的错误。
BenchmarkDotNet=v0.13.0, OS=Windows 10.0.17134.677 (1803/April2018Update/Redstone4)
Intel Core i7-7700HQ CPU 2.80GHz (Kaby Lake), 2 CPU, 7 logical and 7 physical cores
.NET SDK=5.0.202
[Host] : .NET Core 3.1.14 (CoreCLR 4.700.21.16201, CoreFX 4.700.21.16208), X64 RyuJIT
DefaultJob : .NET Core 3.1.14 (CoreCLR 4.700.21.16201, CoreFX 4.700.21.16208), X64 RyuJIT
方法 | 意思是 | 错误 | 标准差 |
---|---|---|---|
使用修剪结束 | 49.57 微秒 | 0.976 微秒 | 1.085 微秒 |
使用GetDirectoryName | 49.30 微秒 | 0.703 微秒 | 0.624 微秒 |
使用新目录信息 | 51.82 微秒 | 1.021 微秒 | 1.362 微秒 |
使用DirectoryInfoGetDirectories | 49.78 微秒 | 0.789 微秒 | 0.877 微秒 |
public class PathBenchMark
{
private const string RootPath = @"C:\Program Files\dotnet\";
public List<string> Paths => Directory.GetDirectories(RootPath, "*", SearchOption.AllDirectories).ToList();
[Benchmark]
public List<string> UseTrimEnd() => Paths.Select(c => Path.GetFileName(c.TrimEnd(Path.DirectorySeparatorChar))).ToList();
[Benchmark]
public List<string> UseGetDirectoryName() => Paths.Select(c => Path.EndsInDirectorySeparator(c) ? Path.GetFileName(Path.GetDirectoryName(c)) : Path.GetFileName(c) ).ToList();
[Benchmark]
public List<string> UseNewDirectoryInfo() => Paths.Select(c => new DirectoryInfo(c).Name).ToList();
[Benchmark]
public List<string> UseDirectoryInfoGetDirectories() => new DirectoryInfo(RootPath).GetDirectories("*", SearchOption.AllDirectories).Select(c => c.Name).ToList();
}
class Program
{
public static void Main()
{
BenchmarkRunner.Run<PathBenchMark>();
}
}
您可以使用DirectoryInfo
class 来检索您需要的所有信息,请查看Microsoft 文档
string[] dirs = Directory.GetDirectories("\\\\" + Servername + "\\E$\\SUBDIR1\\SUBDIR2\\");
foreach(var dir in dirs)
{
var dirInfo = new DirectoryInfo(dir);
MessageBox.Show(dinfo.Name); //This will show only the directory name
MessageBox.Show(dinfo.FullName); //This will show the complete path of the directory
}
这应该适合你。
public void Getdire1(string Servername)
{
string[] dirs = Directory.GetDirectories("\\\\" + Servername + "\\E$\\SUBDIR1\\SUBDIR2\\");
foreach (string item in dirs)
{
System.Windows.Forms.MessageBox.Show(Path.GetFileName(item));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.