x 深度的所有文件夹和文件列表

问题描述 投票:0回答:5

我想要 x 深度的所有文件夹和文件的列表。

如果 x 是 2,那么我将获得有关第一个文件夹中的所有文件夹和文件以及第一个文件夹中的文件夹中的所有文件夹和文件的信息。

如何做到这一点?

c# .net visual-studio-2010 file directory
5个回答
5
投票

此代码将执行其他答案正在执行的操作,但也会返回文件夹名称(因为这似乎是您所要求的内容的一部分)。这将需要 .Net 4.0。如果您希望跟踪哪些是文件夹,哪些是文件,您可以返回一个包含文件列表和文件夹列表的元组。

List<string> GetFilesAndFolders(string root, int depth)
{
    var list = new List<string>();
    foreach(var directory in Directory.EnumerateDirectories(root))
    {
        list.Add(directory);
        if (depth > 0)
        {
            list.AddRange(GetFilesAndFolders(directory, depth-1));
        }
    }

    list.AddRange(Directory.EnumerateFiles(root));

    return list;
}

编辑:将文件夹和文件分开的代码

Tuple<List<string>,List<string>> GetFilesAndFolders(string root, int depth)
{
    var folders = new List<string>();
    var files = new List<string>();
    foreach(var directory in Directory.EnumerateDirectories(root))
    {
        folders.Add(directory);
        if (depth > 0)
        {
                var result = GetFilesAndFolders(directory, depth-1);
                folders.AddRange(result.Item1);
                files.AddRange(result.Item2);
        }
    }

    files.AddRange(Directory.EnumerateFiles(root));

    return new Tuple<List<string>,List<string>>(folders, files);
}

2
投票

我觉得这个问题以前已经解决了。基本上,您想要做的是询问当前文件是否是一个目录,如果为 true 并且 x 尚未达到最大值,尚未获取该文件的子目录。此外,您还需要检查该目录中是否存在文件并检索它们。


2
投票

如果您只想要文件名,您可以使用递归方法来完成。像这样的东西: (不保证完全正确,我在没有编译器的情况下编写)

    public static List<String> GetSubfoldersAndFiles(DirectoryInfo di, int deep)
    {
       List<string> myContent = new List<string>();
       foreach(FileInfo fi in di.GetFiles())
       {
          myContent.Add(fi.FullName);
       }

       if(deep > 0)
       {
          foreach(DirectoryInfo subDi in di.GetDirectories())
          {
              myContent.AddRange(GetSubfoldersAndFiles(subDi, deep - 1).ToArray());
          }
       }

       return myContent;
    }

电话会是这样的:

List<string> content = GetSubfoldersAndFiles(new DirectoryInfo(@"c:\"), 3);

1
投票

所有子文件夹

public List<string> listDir(string pPath)
        {
            List<string> dirList = new List<string>();
            listDir(pPath, dirList);
            return dirList;
        }
private void listDir(string pPath, List<string> pList)
        {
                string[] loDirs = System.IO.Directory.GetDirectories(pPath);
                foreach (string loDir in loDirs)
                {
                    pList.Add(loDir);
                    listDir(loDir, pList);
                }
        }

1
投票

扩展@pstrjds答案

private static IReadOnlyList<string> SearchFiles(string root, string pattern = "*", int depth = 1, params string[] exceptFolders)
{
    var files = Directory
        .EnumerateDirectories(root)
        .Where(it => !exceptFolders.Contains(Path.GetRelativePath(root, it)) && depth > 0)
        .SelectMany(it => SearchFiles(it, pattern, depth - 1, exceptFolders))
        .ToList();

    files.AddRange(Directory.EnumerateFiles(root, pattern));

    return files;
}
© www.soinside.com 2019 - 2024. All rights reserved.