CoderNotes - заметки программиста

Публикации  »  C#, C++
Скидка 65% на Skillbox

Получите скидку 65% на любой курс программирования на популярной образовательной платформе Skillbox!

Подробнее
Бесплатный хостинг + SSL-сертификат

Зарегистрируйте домен и получите 2 месяца бесплатного хостинга и SSL-сертификат на 1 год в подарок

Подробнее

Как получить список файлов и папок на C#

Задача получения списка файлов или папок в другой папке часто бывает при написании программы, поэтому, чтобы рецепт всегда был под рукой, решил написать коротенькую статью.

Получить список файлов в папке

Для получения списка файлов можно воспользоваться методом GetFiles.

Пример поиска файлов:

string[] allfiles = Directory.GetFiles(PathToFolder);
foreach (string filename in allfiles)
{
    Console.WriteLine(filename);
}

Метод GetFiles может принимать 3 параметра, из которых первый обязательный:

GetFiles(String path, String pattern, SearchOption options)

path - путь к папке, в которой ищем файлы;

pattern - шаблон поиска файлов (например, *.txt или ??abc.doc);

options - способ поиска, указывающий нужно искать только в текущей папке (SearchOption.TopDirectoryOnly) или во вложенных тоже (SearchOption.AllDirectories).

Пример поиска файлов по шаблону смотрите ниже (рекурсивный поиск).

Если список файлов очень большой, тогда лучше воспользоваться методом EnumerateFiles (доступен в .NET Framework 4.0 и выше), т.к. в отличие от GetFiles он возвращает IEnumerable и заполняет его как бы асинхронно, т.е. можно приступить к перебору списка файлов сразу, не дожидаясь получения всего списка и тем самым увеличить скорость обработки полученных файлов.

Метод EnumerateFiles так же может принимать 3 параметра:

path - путь к папке, в которой ищем файлы;

pattern - шаблон поиска файлов;

options - способ поиска.

Пример поиска файлов методом EnumerateFiles:

IEnumerable allfiles = Directory.EnumerateFiles(PathToFolder);
foreach (string filename in allfiles)
{
    Console.WriteLine(filename);
}

Как видим, поиск методом EnumerateFiles аналогичен GetFiles, однако, он начнется сразу, до получения всего списка файлов, что может быть актуальным при очень большом количестве файлов.

Получить список папок в папке

Для получения списка папок можно воспользоваться методом GetDirectories.

Пример поиска папок с помощью GetDirectories:

string[] allfolders = Directory.GetDirectories(PathToFolder);
foreach (string folder in allfolders)
{
    Console.WriteLine(folder);
}

Метод GetDirectories может принимать 3 параметра, из которых первый обязательный:

GetDirectories(String path, String pattern, SearchOption options)

path - путь к папке, в которой ищем файлы;

pattern - шаблон поиска файлов (например, *.txt или ??abc.doc);

options - способ поиска, указывающий нужно искать только в текущей папке (SearchOption.TopDirectoryOnly) или во вложенных тоже (SearchOption.AllDirectories).

По аналогии с поиском файлов, есть метод EnumerateDirectories, который позволяет обрабатывать список папок не дожидаясь его полного получения (доступен в .NET Framework 4.0 и выше).

Метод EnumerateDirectories аналогично GetDirectories принимает 3 параметра:

path - путь к папке, в которой ищем файлы;

pattern - шаблон поиска файлов;

options - способ поиска.

Пример поиска папок с помощью EnumerateDirectories:

IEnumerable allfolders = Directory.EnumerateDirectories(PathToFolder);
foreach (string folder in allfolders)
{
    Console.WriteLine(folder);
}

Примечание: Во всех способах получения файлов и папок можно во втором параметре указывать шаблон поиска pattern, однако в нем можно использовать только * (любое количество любых символов) и ? (один любой символ) для указания шаблона поиска, регулярные выражения не поддерживаются.

Получить список файлов по шаблону рекурсивно

В этом случае нужно лишь добавить 2-й параметр, в котором указываем маску файлов и 3-й параметр, означающий что нужно искать файлы так же во вложенных папках.

string[] AllFiles = Directory.GetFiles(PathToFolder, "*.*", SearchOption.AllDirectories);
foreach (string filename in AllFiles)
{
    Console.WriteLine(filename);
}

Однако, у этого способа есть недостаток - в случае, если в какую-то папку нет доступа, получится ошибка и список файлов не будет получен совсем.

Рекурсивно получить список всех файлов и папок

Этот пример рекурсивного поиска файлов и папок не прервется в случае ошибки, а продолжится дальше. Вместо массива здесь используется List для записи списка файлов и папок.

List<string> ls = GetRecursFiles(PathToFolder);
foreach (string fname in ls)
{
    MessageBox.Show(fname);
}

private List<string> GetRecursFiles(string start_path)
{
    List<string> ls = new List<string>();
    try
    {
        string[] folders = Directory.GetDirectories(start_path);
        foreach (string folder in folders)
        {
            ls.Add("Папка: " + folder);
            ls.AddRange(GetRecursFiles(folder));
        }
        string[] files = Directory.GetFiles(start_path);
        foreach (string filename in files)
        {
            ls.Add("Файл: " + filename);
        }
    }
    catch (System.Exception e)
    {
        MessageBox.Show(e.Message);
    }
    return ls;
}

Плюсом такого рекурсивного поиска так же является то, что можно еще и контролировать уровень вложенности и делать, например, отступы для разных уровней.

 

Категория: C#, C++

Книги по теме:

Станислава Солнечная

Программирование на С, С++

Посмотреть все книги по программированию

Комментарии к статье:

26.11.19   Гость ТО что надо!!! Респект и уважуха.
01.05.21   Гость а что такое PathToFolder?
08.05.21   Гость Гость, путь к директрриям, он так просто сменную назвал
02.06.21   Alitrix Данные функции, в частности : Directory.GetFiles, Directory.GetDirectories
на отображают верное количество директорий и файлов в них, c:\Windows\System32 c:\Windows\System32\Drive
даже если запустить приложение с правами администратора, почему так ? Каталог c:\Windows\System32\Drive\etc его нет в перечислениях. Тогда как можно получить на с# верную файловую структуру содержащую все каталоги и файлы ? alien-kms@mail.ru
04.01.23   Гость Спасибо!

Добавить комментарий: