代码之家  ›  专栏  ›  技术社区  ›  MMac

如何编写一个C#方法,使用String[]和List<String[]>,检索目录树中的所有目录?

  •  1
  • MMac  · 技术社区  · 6 年前
     public static List<string[]> SubSubFolders()
        {
           // int variable for while loop
            int i = 0;
            // String Array to hold top SubFol
            string[] dir = Directory.GetDirectories("c:\\");
    
            //List<String[]> to hold a list of arrays from dir
            List<string[]> subSub = new List<string[]>();
    
            string[] finalResult = new string[0];
    
            //Loop through all the folders in the dir.
            while (i < dir.Length)
            {
                string folder1 = dir(i);
    
                DirectoryInfo di = new DirectoryInfo(folder1);
                if (!di.Attributes.HasFlag(FileAttributes.Hidden))
                {   
                    subSub.Add(Directory.GetDirectories(folder1));
                }
                i++;
            }
    
            return subSub;
        }
    

    这是我的密码。我的目标是创建一个程序,允许我遍历给定目录下存在的所有目录,并按它们出现的顺序列出它们。例如,整个代码将执行以下操作:

    c:\documents
    c:\documents\abtemp
    c:\documents\abtemp\chuck
    c:\documents\rubbish
    c:\documents\state1
    etc
    

    我可以打印出第二个级别,并将进入更深的子目录。我的问题是,我的打印结果根本没有显示最上面的文件夹。

    我为解决此问题所做的工作: *尝试将dir添加到subSub:我遇到错误,无法将String转换为String[]。 *尝试将subSub更改为string[],而不是list:我无法将子目录添加到数组中。 *尝试将目录更改为列表,而不是字符串[]: *目录。GetDirectories出现错误,无法将类型“string[]”隐式转换为“System”。集合。通用的列表'

    那么我的问题是:如何将我的dir添加到subSub,或者将dir添加到subSub,以完成列表?有没有更干净的方法来实现这一点?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Peter    6 年前

    你的问题有点模棱两可,所以我不确定你到底想帮助解决什么问题,但我想我看到了你想要实现的目标-通过文件夹树列出所有文件夹?

    如果是这样的话,最好的方法是使用递归函数—让函数自己调用,直到它到达树的底部,并在运行时添加到列表中:

    class Program
    {
        static void Main(string[] args)
        {
            var list = new List<string>();
            SubSubFolders(@"C:\Program Files\Microsoft Office", list);
    
            Console.WriteLine(list.Aggregate((s1,s2)=>s1+Environment.NewLine+s2));
            Console.WriteLine("Press enter...");
            Console.ReadLine();
        }
    
    
        public static void SubSubFolders(string basePath, List<string> folders)
        {
            //if (folders.Count > 500) return;
            string[] dirs = new string[] { };
            try
            {
                dirs = Directory.GetDirectories(basePath);
            }
            catch(Exception exc)
            {
                // Handle access failures - there will be folders you can't enumerate unless running as admin
            }
    
            for (int i = 0; i < dirs.Length; i++)
            {
                folders.Add(dirs[i]);
                SubSubFolders(dirs[i], folders);
            }
        }
    }
    

    请注意,如果您试图枚举平均计算机上的所有目录(例如从c:\),这将需要很长时间。为此,您需要进行一些认真的优化,如果您想获得真正好的性能,可能需要使用较低级别的语言。

    还要注意的是,您无法轻松添加到数组中-它的大小是在创建时设置的。