як перерахувати всі підкаталоги в каталозі


83

Я працюю над проектом, і мені потрібно перерахувати всі підкаталоги в каталозі, наприклад, як я можу перерахувати всі підкаталоги в 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, він ловить виняток і просто повертає порожній список для цього недоступного каталогу. Потім він переходить до наступного підкаталогу.



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

        }

якщо ви хочете зробити перелік у вікні списку та дозволити користувачеві вибрати папку, так, ця відповідь працює.
Мерт Гюлсой,

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)

Потрібна додаткова закриваюча дужка в кінці (Мав би її відредагувати, але потрібно змінити \ додати принаймні шість символів, щоб її прийняли). Також зверніть увагу, що для використання 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 #, чи не так?
Тобонавт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.