12

私は、ファイル システムを通過する必要がある作業に取り組んでおり、任意のパスについて、フォルダー構造の「深さ」を知る必要があります。これが私が現在使用しているものです:

int folderDepth = 0;
string tmpPath = startPath;

while (Directory.GetParent(tmpPath) != null) 
{
    folderDepth++;
    tmpPath = Directory.GetParent(tmpPath).FullName;
}
return folderDepth;

これは機能しますが、より良い/より速い方法があると思いますか? フィードバックをお寄せいただきありがとうございます。

4

7 に答える 7

13

私の頭の上から:

Directory.GetFullPath().Split("\\").Length;
于 2008-11-25T00:44:01.837 に答える
9

私はこれに遅れをとっていますが、ポール・ソニエの答えはおそらく最短ですが、次のようにする必要があることを指摘したかったのです。

 Path.GetFullPath(tmpPath).Split(Path.DirectorySeparatorChar).Length;
于 2015-11-12T15:29:37.563 に答える
4

私は常に再帰的ソリューションのファンです。非効率だけど楽しい!

public static int FolderDepth(string path)
{
    if (string.IsNullOrEmpty(path))
        return 0;
    DirectoryInfo parent = Directory.GetParent(path);
    if (parent == null)
        return 1;
    return FolderDepth(parent.FullName) + 1;
}

私は C# で書かれた Lisp コードが大好きです!

これは、私がさらに気に入っていて、おそらくより効率的な別の再帰バージョンです。

public static int FolderDepth(string path)
{
    if (string.IsNullOrEmpty(path))
        return 0;
    return FolderDepth(new DirectoryInfo(path));
}

public static int FolderDepth(DirectoryInfo directory)
{
    if (directory == null)
        return 0;
    return FolderDepth(directory.Parent) + 1;
}

いい時代、いい時代…

于 2008-11-25T05:38:22.193 に答える
3

クラスのメンバーを使用するPathと、パス区切り文字のローカライズおよびその他のパス関連の警告に対処できます。次のコードは、深さ (ルートを含む) を提供します。悪い文字列などに対して堅牢ではありませんが、それはあなたにとっての出発点です。

int depth = 0;
do
{
    path = Path.GetDirectoryName(path);
    Console.WriteLine(path);
    ++depth;
} while (!string.IsNullOrEmpty(path));

Console.WriteLine("Depth = " + depth.ToString());
于 2008-11-25T03:58:10.680 に答える
2

パスが有効であることが既に精査されていると仮定すると、.NET 3.5 では、LINQ を使用して 1 行のコードで実行することもできます...

Console.WriteLine(@"C:\Folder1\Folder2\Folder3\Folder4\MyFile.txt".Where(c => c = @"\").Count);

于 2008-11-25T04:49:09.907 に答える