如何列出目录中的所有子目录

103
我正在做一个项目,需要列出一个目录中的所有子目录。例如,我如何列出C盘中的所有子目录?
7个回答

178

使用Directory.GetDirectories方法获取指定"your_directory_path"目录的子目录。结果是一个字符串数组。

var directories = Directory.GetDirectories("your_directory_path");

默认情况下,该方法只返回一级子目录。有选项可以递归地返回所有子目录并过滤结果,在此处记录,并在Clive的回答中展示。


避免UnauthorizedAccessException

如果访问一个没有权限的目录,很容易出现UnauthorizedAccessException

您可能需要创建自己的方法来处理异常,例如:

public class CustomSearcher
{ 
    public static List<string> GetDirectories(string path, string searchPattern = "*",
        SearchOption searchOption = SearchOption.AllDirectories)
    {
        if (searchOption == SearchOption.TopDirectoryOnly)
            return Directory.GetDirectories(path, searchPattern).ToList();

        var directories = new List<string>(GetDirectories(path, searchPattern));

        for (var i = 0; i < directories.Count; i++)
            directories.AddRange(GetDirectories(directories[i], searchPattern));

        return directories;
    }

    private static List<string> GetDirectories(string path, string searchPattern)
    {
        try
        {
            return Directory.GetDirectories(path, searchPattern).ToList();
        }
        catch (UnauthorizedAccessException)
        {
            return new List<string>();
        }
    }
}

然后这样调用它:

var directories = CustomSearcher.GetDirectories("your_directory_path");

这段代码递归遍历指定目录及其所有子目录。如果它遇到一个无法访问的子目录,比如会抛出UnauthorizedAccessException的情况,它会捕获异常并返回一个空列表表示该无法访问的目录,并继续处理下一个子目录。


70

就是这么简单:

string[] folders = System.IO.Directory.GetDirectories(@"C:\My Sample Path\","*", System.IO.SearchOption.AllDirectories);

超级解决方案! - Majedur
搜索模式为“*”是个秘密,因为我们不能传递空值,非常好的解决方案! - fellyp.santos

8

使用:

FolderBrowserDialog fbd = new FolderBrowserDialog();

DialogResult result = fbd.ShowDialog();

string[] files = Directory.GetFiles(fbd.SelectedPath);
string[] dirs = Directory.GetDirectories(fbd.SelectedPath);

foreach (string item2 in dirs)
{
    FileInfo f = new FileInfo(item2);

    listBox1.Items.Add(f.Name);
}

foreach (string item in files)
{
    FileInfo f = new FileInfo(item);

    listBox1.Items.Add(f.Name);
}

如果您想在列表框中进行列表,并允许用户选择哪个文件夹,那么这个答案是可行的。 - Mert Gülsoy
需要解释一下。例如,这个想法/主旨是什么?来自帮助中心的解释:“...始终解释为什么你提出的解决方案是合适的以及它是如何工作的”。请通过编辑(更改)您的答案进行回应,而不是在评论中回复(*** *** *** *** *** 不要 *** *** *** *** ***包含“编辑:”,“更新:”或类似的内容 - 答案应该看起来像是今天写的)。 - Peter Mortensen

5

使用:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TRIAL
{
    public class Class1
    {
        static void Main(string[] args)
        {
           string[] fileArray = Directory.GetDirectories("YOUR PATH");
           for (int i = 0; i < fileArray.Length; i++)
           {
               Console.WriteLine(fileArray[i]);
           }
           Console.ReadLine();
        }
    }
}

一个解释是需要的。例如,意思/主旨是什么?从帮助中心:*"...总是解释为什么你提供的解决方案是合适的以及它是如何工作的". 请通过编辑(更改)您的回答进行回应,而不是在评论中回答(** *** *** *** *** 无需 *** *** *** *** *** "编辑:"、"更新:"或类似内容——回答应该看起来像是今天写的)。例如,为什么要使用ReadLine() - Peter Mortensen

2

如果您只需要简单的文件夹列表而不是完整路径,您可以使用以下命令:

Directory.GetDirectories(parentDirectory).Select(d => Path.GetRelativePath(parentDirectory, d)

1
需要在结尾处添加一个额外的闭合括号(本来想编辑它,但需要更改或添加至少六个字符才能被接受)。还请注意,您需要安装.NET Standard 2.1才能使用Path.GetRelativePath。 - StuKay

1
这是列出所有目录和子目录的最佳且最快的方法,可以跳过System.UnauthorizedAccessException:
一个简单的递归方法,通过实时检索的操作来准备一个列表并返回给父级,需要很长时间。这个回调函数在实时检索方面非常有帮助,而不是准备和返回。
using System.IO;

private static void ListDirectories(string Path, Action<string> Listen){
    try
    {
        foreach(string Node in Directory.GetDirectories(Path)){
            Listen(Node);
            ListDirectories(Node, Listen);
        }
    } catch {}
}

使用方法

static void Main(string[] args)
{
    ListDirectories(@"C:\", (dir) =>
    {
        Console.WriteLine(dir);
    });
}

您指的“实时检索”是什么意思? - Peter Mortensen

-3
显示所有目录和子目录
def dir():

    from glob import glob

    dir = []

    dir = glob("path")

def all_sub_dir(dir):
    {
        for item in dir:
            {
                b = "{}\*".format(item)
                dir += glob(b)
            }
            print(dir)
    }

7
这是Python,不是C#,对吗? - Tobonaut
这个回答看起来是完全虚假的,混合了Python和C。这可能会导致"IndentationError: unexpected indent"错误。我已经投票删除了这个回答。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接