Поиск файлов в директориях

282
02 июля 2017, 12:21

Необходимо найти все файлы на диске. Есть такой код:

System.IO.DirectoryInfo number = new System.IO.DirectoryInfo(@"D:\");
int count = number.GetFiles().Length;

Ищет, но не ищет во всех папках. Пробовал так:

System.IO.DirectoryInfo number = new System.IO.DirectoryInfo(@"D:\");
int count = number.GetFiles(".", SearchOption.AllDirectories).Length;
Answer 1

SearchOption.AllDirectories будет ронять весь поиск, если к одному из подкаталогов нет доступа. А учитывая, что ты передаёшь корень диска, там гарантированно попадётся System Volume Information и поиск упадёт. В остальном код работоспособный.

Чтобы правильно обработать каталоги, к которым нет доступа, надо вместо передачи этого флага написать рекурсивную функцию, которая будет сама перебирать каталоги и игнорировать (или каким-либо ещё образом обрабатывать) исключения ошибки доступа.

PS: https://ru.stackoverflow.com/a/419435/178988
http://bbs.vbstreets.ru/viewtopic.php?f=2&t=44440
http://www.cyberforum.ru/csharp-beginners/thread957151.html

Answer 2

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

    private string directoryPath = @"D:\Папка";
    /* Обработчик нажатия на кнопку "Сканировать". */
    private void btnScan_Click(object sender, EventArgs e)
    {
        string mask = "*.sln"; // например, можно любую другую
        DirectoryInfo root = new DirectoryInfo(directoryPath);            
        try
        {
            // Ищем файлы в корневой директории.
            getFiles(root);
            // Рекурсивный поиск по поддиректориям.
            getChildDirectories(root);
        }
        catch (Exception ex)
        {
            // ...
        }
    }
    private void getChildDirectories(DirectoryInfo rootDirectory)
    {
        foreach (DirectoryInfo directory in rootDirectory.GetDirectories())
        {
            try
            {
                getFiles(directory);
                getChildDirectories(directory);
            }
            catch (Exception ex)
            {
                // ...
            }
        }
    }
    private void getFiles(DirectoryInfo directory)
    {
        var files = Directory.EnumerateFiles(directory.FullName, mask, SearchOption.TopDirectoryOnly);
        foreach (var file in files)
        {
            // делаешь что-то хорошее с каждым найденным файлом.
        }
    }
READ ALSO
HtmlAgilityPack как убрать пробелы

HtmlAgilityPack как убрать пробелы

Текст парсится в хаотичном порядке, одно слово на первой строке, второе на 2 и тд

274
SWIG - c# - обертка для enum

SWIG - c# - обертка для enum

Не могу сделать C# обертку для enum C++ c помощью SWIGЗначение членов c++ enum, которые я хочу обернуть превосходят максимальное значение для Int32

217
Aes дешифрация байтов c#

Aes дешифрация байтов c#

Пытаюсь расшифровать зашифрованные байты алгоритмом AES, c#

385
Не определяется свойство зависимости в wpf?

Не определяется свойство зависимости в wpf?

Разбираюсь со свойствами зависимостиКак я понял, что бы создать свойство зависимости необходимо проделать следующие шаги (сейчас буду их сравнивать...

271