4

我正在寻找一组简单的 API 方法来确定一个文件夹是否是另一个文件夹的子目录,以及这之间有多少个步骤。就像是:

int numberOfFoldersDown(string parentFolder, string subfolder)  { ... }

它似乎很有用,虽然写起来很乏味,所以我认为它应该在System.IO.PathorSystem.IO.Directory程序集中的某个地方,但我在那里找不到任何有用的方法。这些功能是否可用,还是我应该自己编写?

4

4 回答 4

1

没有任何内置的AFAIK。

这是一些同时使用PathandDirectory方法的递归示例:

internal class Program
{
    private static void Main(string[] args)
    {
        Console.WriteLine(NumberOfFoldersDown(@"c:\temp\", @"c:\temp\"));                   // 0
        Console.WriteLine(NumberOfFoldersDown(@"c:\temp\", @"c:\temp\zz\"));                // 1
        Console.WriteLine(NumberOfFoldersDown(@"c:\temp2\", @"c:\temp\zz\"));               // -1
        Console.WriteLine(NumberOfFoldersDown(@"c:\temp2\", @"c:\temp2\zz\hui\55\"));       // 3
        Console.WriteLine(NumberOfFoldersDown(@"c:\temp2\zz\", @"c:\temp2\zz\hui\55\"));    // 2

        Console.Read();
    }

    public static int NumberOfFoldersDown(string parentFolder, string subfolder)
    {
        int depth = 0;
        WalkTree(parentFolder, subfolder, ref depth);
        return depth;
    }

    public static void WalkTree(string parentFolder, string subfolder, ref int depth)
    {
        var parent = Directory.GetParent(subfolder);
        if (parent == null)
        {
            // Root directory and no match yet
            depth = -1;
        }
        else if (0 != string.Compare(Path.GetFullPath(parentFolder).TrimEnd('\\'), Path.GetFullPath(parent.FullName).TrimEnd('\\'), true))
        {
            // No match yet, continue recursion
            depth++;
            WalkTree(parentFolder, parent.FullName, ref depth);
        }
    }
}
于 2013-10-11T13:13:37.837 回答
0

您可以遍历所有文件夹,获取路径名,一旦获得路径名,循环检查每个“/”的字符串,然后计算有多少 /,例如:

C:/用户/程序文件/

有 3 个 / 所以你想要的文件/文件夹有 3 个跃点

希望这是您想要的一些有用的信息。

于 2013-10-11T12:38:25.343 回答
0

只要我知道唯一的方法就是

parent folder : Split the path on "\" and think to remove the drive letter and colon
subfolder     : navigate it recursively (which can be time consuming)

在此必须考虑许多其他点,但这是一个大主意!

编辑:好的,这是您需要的示例...还有更多工作要做,但我认为这是一个好的开始...优点是您可以使用未知的文件夹结构,而不仅仅是表示路径的字符串。

public static class FoldersHelper
{
    public static int ParentFolderCount(string path)
    {
        int parentcnt = 0;

        if (System.IO.Directory.Exists(path))
        {
            string pathroot = Path.GetPathRoot(path);
            path = path.Remove(1, pathroot.Length);
            parentcnt = path.Split('\\').Count()-1;
            return parentcnt;
        }
        else
        {
            throw new Exception("not a folder exception");
        }

        return 0;
    }

    public static int ChildFolderCount(string path)
    {
        int childcnt = 0;
        int maxchild = 0;

        if (System.IO.Directory.Exists(path))
        {
            if (Directory.GetDirectories(path).Length > 0)
            {
                foreach (string subpath in Directory.GetDirectories(path))
                {
                    childcnt = ChildFolderCount(subpath) + 1;
                    if (childcnt > maxchild) maxchild = childcnt;
                }
            }
        }
        else
        {
            throw new Exception("not a folder exception");
        }

        return maxchild;
    }

}
于 2013-10-11T12:39:12.033 回答
0

以某种方式找到路径,也许通过迭代它们。

当你发现一个用反斜杠分割路径时,将这些部分放在一个数组中。反转数组,遍历该数组,检查文件夹名称是否与父文件夹名称字符串匹配。如果是,返回索引 + 1 的步骤?

于 2013-10-11T12:50:40.227 回答