簡體   English   中英

C# 獲取目錄名稱

[英]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:\mydirC:\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\將導致DirBC:\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()返回完整路徑而沒有尾隨\這將返回錯誤的目錄...即我從現在開始使用DirectoryInfoTrimEnd()因為我不想犯同樣的錯誤。


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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM