Задача получения списка файлов или папок в другой папке часто бывает при написании программы, поэтому, чтобы рецепт всегда был под рукой, решил написать коротенькую статью.
Получить список файлов в папке
Для получения списка файлов можно воспользоваться методом 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:
IEnumerableallfiles = 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:
IEnumerableallfolders = 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:\Windows\System32 c:\Windows\System32\Drive
даже если запустить приложение с правами администратора, почему так ? Каталог c:\Windows\System32\Drive\etc его нет в перечислениях. Тогда как можно получить на с# верную файловую структуру содержащую все каталоги и файлы ? alien-kms@mail.ru
Добавить комментарий: