как перечислить все подкаталоги в каталоге

84

Я работаю над проектом, и мне нужно перечислить все подкаталоги в каталоге, например, как я могу перечислить все подкаталоги в c: \

Мэтью
источник

Ответы:

143

Используйте Directory.GetDirectoriesдля получения подкаталогов каталога, указанного в "your_directory_path" . В результате получается массив строк.

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

По умолчанию это возвращает только подкаталоги на один уровень глубиной. Есть варианты, чтобы вернуть все рекурсивно и отфильтровать результаты, задокументированные здесь и показанные в ответе Клайва.


Как избежать исключения 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вызвать исключение, оно перехватывает исключение и просто возвращает пустой список для этого недоступного каталога. Затем он переходит к следующему подкаталогу.

Грант Винни
источник
61

Это просто:

string[] folders = System.IO.Directory.GetDirectories(@"C:\My Sample Path\","*", System.IO.SearchOption.AllDirectories);
Клайв
источник
Супер решение!
Majedur Rahaman
7
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);

        }
Хакан СУМНУЛУ
источник
если вы хотите сделать список в списке и предоставить пользователю возможность выбирать, какую папку, да, этот ответ работает.
Мерт Гюльсой, 01
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();
        }
    }
}
Маюр Нарула
источник
0

Чтобы получить простой список папок без полного пути, вы можете использовать:

Directory.GetDirectories(parentDirectory).Select(d => Path.GetRelativePath(parentDirectory, d)
BuddyZ
источник
Требуется дополнительная закрывающая скобка в конце (отредактировал бы, но нужно изменить \ добавить не менее шести символов, чтобы он был принят). Также обратите внимание, что для использования Path.GetRelativePath вам необходимо установить .NET Standard 2.1
StuKay,
-1

показать все директории и подкаталоги

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)
}
Мостафа-Хаджян
источник
3
Это же Pyhon, а не C #, не так ли?
Tobonaut