【问题标题】:List of all folders and files for x depthx深度的所有文件夹和文件的列表
【发布时间】:2011-09-02 18:06:53
【问题描述】:

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

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

如何做到这一点?

【问题讨论】:

    标签: c# .net visual-studio-2010 file directory


    【解决方案1】:

    此代码将执行其他答案正在执行的操作,但还会返回文件夹名称(因为这似乎是您所询问的内容的一部分)。这将需要 .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);
    }
    

    【讨论】:

    • 而且'above'在这里并不是一个好的参考机制。查看排序选项卡。
    • 就排序而言,添加或带回多个列表很容易,问题是文件夹和文件列表......所以我是这样写的。至于上面的参考,你是对的,是着急没想通,会编辑
    【解决方案2】:

    我觉得这个问题以前已经解决了。基本上你想要做的是询问当前文件是否是一个目录,如果它是一个目录,如果是真的并且 x 还没有最大化还没有抓住那个文件的子目录。此外,您需要检查该目录中是否存在文件并检索它们。

    【讨论】:

      【解决方案3】:

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

          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));
      

      【讨论】:

      • 实际上你的--deep 会让这个失败。避免 ++-- 的另一个原因,post 或 pre。
      • 那不是真的,--deep 将完全符合我的期望。为什么会失败?
      • 您需要将 --deep 调用移到 foreach 之外,否则您将错误地搜索子目录,除非只有 1 个(想象一下将其称为深度为 3 的示例列表,并且顶级文件夹有 3 个子文件夹,当你到达第二个子文件夹时,你只会搜索深度为 1,第三个你根本不会递归搜索)
      • 但至少此代码也适用于 2.0,是的,生产 grmbl 中仍有 win2k 服务器...;-)
      【解决方案4】:

      所有子文件夹

      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);
                      }
              }
      

      【讨论】:

        【解决方案5】:

        扩展@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;
        }
        

        【讨论】:

        • Path.GetRelativePath(root, it) 似乎不作为路径的一部分存在。我只是删除了它和 exceptFolders arg,因为我不需要它。
        猜你喜欢
        • 2015-03-25
        • 2013-01-27
        • 1970-01-01
        • 2020-07-02
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 2020-09-11
        • 1970-01-01
        相关资源
        最近更新 更多