[英]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.