Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/87: Рейтинг темы: голосов - 87, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 11.07.2015
Сообщений: 2
.NET 4.x

Глобальный поиск файла

12.07.2015, 20:37. Показов 17797. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Столкнулся с проблемой поиска файлов на компьютере при помощи System.IO.DirectoryInfo.GetFiles();

При попытке осуществить поиск вываливается ошибка: Отказано в доступе по пути "C:\Documents and Settings" и это с учетом того что я обладаю правами админа, и доступ к этой папке у меня свободный.

Мой код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.IO;
 
namespace testApp
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            string[] localDrivers = Directory.GetLogicalDrives();
 
 
            foreach (string drive in localDrivers)
            {
                DirectoryInfo dirInfo = new DirectoryInfo(drive);
 
                FileInfo[] result = dirInfo.GetFiles("CSService.log", SearchOption.AllDirectories);
 
                foreach (var file in result)
                    Console.WriteLine("найден" + file.FullName);
                
            }
 
            Console.WriteLine("Готово");
            Console.ReadKey();
        }
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.07.2015, 20:37
Ответы с готовыми решениями:

Глобальный поиск по базе
база данных состоит из 50ти таблиц( в некоторых 16 полей), нужно вычислить в каких таблицах а в них в каких столбцах находится искомое...

глобальный поиск, зачем нужен?
Добрый день, объясните зачем нужен символ глобального поиска g в конце оператора =~//g Например для задачи матчинга строк из файла: ...

Глобальный поиск в базе через VBA
Добрый день. Помогите организовать глобальный поиск и фильтр контрагентов в списке. Не силен в VBA поэтому требуется помощь специалистов....

26
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18240 / 14154 / 5366
Регистрация: 17.03.2014
Сообщений: 28,841
Записей в блоге: 1
12.07.2015, 21:33
Лучший ответ Сообщение было отмечено mrdonald как решение

Решение

mrdonald, это недостаток реализации методов поиска файлов в .NET. Если каталог недоступен пользователю (а некоторые каталоги недоступны даже админу), то он падает с исключением. У меня на этот случай есть такой метод:
SafeEnumerateFiles
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/// <summary>
/// Возвращает перечисляемую коллекцию имен файлов которые соответствуют шаблону в указанном каталоге, с дополнительным просмотром вложенных каталогов
/// </summary>
/// <param name="path">Полный или относительный путь катага в котором выполняется поиск</param>
/// <param name="searchPattern">Шаблон поиска файлов</param>
/// <param name="searchOption">Одно из значений перечисления SearchOption указывающее нужно ли выполнять поиск во вложенных каталогах или только в указанном каталоге</param>
/// <returns>Возвращает перечисляемую коллекцию полных имен файлов</returns>
private static IEnumerable<string> SafeEnumerateFiles(string path, string searchPattern = "*.*", SearchOption searchOption = SearchOption.TopDirectoryOnly)
{
    var dirs = new Stack<string>();
    dirs.Push(path);
 
    while (dirs.Count > 0)
    {
        string currentDirPath = dirs.Pop();
        if (searchOption == SearchOption.AllDirectories)
        {
            try
            {
                string[] subDirs = Directory.GetDirectories(currentDirPath);
                foreach (string subDirPath in subDirs)
                {
                    dirs.Push(subDirPath);
                }
            }
            catch (UnauthorizedAccessException)
            {
                continue;
            }
            catch (DirectoryNotFoundException)
            {
                continue;
            }
        }
 
        string[] files = null;
        try
        {
            files = Directory.GetFiles(currentDirPath, searchPattern);
        }
        catch (UnauthorizedAccessException)
        {
            continue;
        }
        catch (DirectoryNotFoundException)
        {
            continue;
        }
 
        foreach (string filePath in files)
        {
            yield return filePath;
        }
    }
}

Обрати внимание что если тебе нужны только имена файлов/каталогов, то не надо использовать DirectoryInfo/FileInfo т.к. они хранят больше информации чем тебе нужно.
8
0 / 0 / 0
Регистрация: 11.07.2015
Сообщений: 2
12.07.2015, 22:09  [ТС]
OwenGlendower, ты просто чудо, очень мне помог)) Спасибо.
0
50 / 37 / 9
Регистрация: 25.06.2014
Сообщений: 406
08.11.2015, 20:02
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Обрати внимание что если тебе нужны только имена файлов/каталогов, то не надо использовать DirectoryInfo/FileInfo т.к. они хранят больше информации чем тебе нужно.
А что можно использовать вместо них?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18240 / 14154 / 5366
Регистрация: 17.03.2014
Сообщений: 28,841
Записей в блоге: 1
08.11.2015, 20:05
SashaPl, вместо них нужно использовать методы классы Directory которые возвращают только названия названия файлов и каталогов.
1
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
06.05.2017, 13:14
Есть ещё вот такой способ, может будет полезен:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public static IEnumerable<FileInfo> EnumerateFiles(string path, string searchPattern = null)
{
    searchPattern = searchPattern ?? "*";
 
    var queue = new Queue<string>();
 
    queue.Enqueue(path);
 
    do
    {
        path = queue.Dequeue();
 
        foreach (var file in SafeEnumerateFiles(path, searchPattern))
        {
            yield return new FileInfo(file);
        }
 
        foreach (var directory in SafeEnumerateDirectories(path))
        {
            queue.Enqueue(directory);
        }
    }
    while (queue.Any());
}
 
static IEnumerable<string> SafeEnumerateFiles(string path, string searchPattern)
{
    try
    {
        return Directory.EnumerateFiles(path, searchPattern);
    }
    catch (DirectoryNotFoundException) { }
    catch (SecurityException) { }
    catch (UnauthorizedAccessException) { }
 
    return Enumerable.Empty<string>();
}
 
static IEnumerable<string> SafeEnumerateDirectories(string path)
{
    try
    {
        return Directory.EnumerateDirectories(path);
    }
    catch (DirectoryNotFoundException) { }
    catch (SecurityException) { }
    catch (UnauthorizedAccessException) { }
 
    return Enumerable.Empty<string>();
}
1
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,891
25.11.2017, 20:57
Что за тип IEnumerable и можно ли его заменить к примеру на string[]
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18240 / 14154 / 5366
Регистрация: 17.03.2014
Сообщений: 28,841
Записей в блоге: 1
25.11.2017, 21:04
Alexandr_7, IEnumerable это интерфейс который описывает коллекцию которую можно перебрать по порядку без возможности изменения элементов. Заменить IEnumerable<string> на string[] можно очень просто - вызови расширяющий метод ToArray()
1
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,891
25.11.2017, 22:32
Нет ну даже если IEnumerable то как получить от туда имя файла хотя лучше функцию переделать под list<>
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18240 / 14154 / 5366
Регистрация: 17.03.2014
Сообщений: 28,841
Записей в блоге: 1
26.11.2017, 07:25
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
если IEnumerable то как получить от туда имя файла
C#
1
2
3
foreach (string fileName in SafeEnumerateFiles(@"c:\windows", "*.*", SearchOption.AllDirectories)
{
}
1
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,891
26.11.2017, 17:55
Как метод переделать под list<string>?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18240 / 14154 / 5366
Регистрация: 17.03.2014
Сообщений: 28,841
Записей в блоге: 1
26.11.2017, 19:06
Alexandr_7, замени тип возвращаемого значения на List<string> и замени цикл в строках 43-46 на на вызов AddRange для списка.
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
14.03.2018, 17:11
Всем здравствуйте. Хочу поделиться .NET библиотекой для решения подобных задач, связанных с поиском файлов и каталогов по определённым критериям, таким как имя (или его часть), расширение, размер, дата создания, дата последнего доступа и т.д. Результаты можно получать как после завершения процесса поиска, так и по мере их нахождения, подписавшись на соответствующее событие, кроме того, поиск можно остановить, если требуемые результаты найдены. Ну и напоследок, операция поиска осуществляется декомпозицией задачи на несколько, выполняемых одновременно в пуле потоков. Так что время выполнения зависит от производительности используемого компьютера, но, как правило, в несколько раз меньше однопоточных алгоритмов, которые также представлены в библиотеке, на случай поиска в небольшом дереве каталогов либо нежелания пользователя сильно нагружать свой процессор. Надеюсь, я не зря потратил время на эту разработку и она кому-то окажется полезной.

Ознакомиться с библиотекой можно здесь: https://github.com/VladPVS/Fas... y/releases
Документация по использованию прилагается.

Добавлено через 2 часа 56 минут
Пример использования библиотеки для поиска файлов:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using FastSearchLibrary;
using System;
using System.Collections.Generic;
using System.IO;   
using System.Text.RegularExpressions;
using System.Threading;
 
namespace SearchTest
{
    class Program
    {
        private static object locker = new object();
 
        static void Main(string[] args)
        {
            // Методы с окончанием Fast используют несколько потоков, что ускоряет операцию поиска, но увеличивает нагрузку на процессор.
            // Методы с окончанием Async не блокируют вызывающий поток, который продолжает выполняться далее.
            // Использование статических методов FileSearcher:
            var list  = FileSearcher.GetFiles(@"C:\Users", (f) => f.Name.Contains("SomeFile")); 
            var task1 = FileSearcher.GetFilesFastAsync(@"C:\Users", "*.txt");
            var task2 = FileSearcher.GetFilesFastAsync(@"C:\", (f) => f.LastAccessTimeUtc >= new DateTime(2018, 3, 1));
 
            List<FileInfo> resultFiles1 = FileSearcher.GetFilesFast(@"C:\", (f) => f.Name.Contains("SomePattern")); 
            List<FileInfo> resultFiles2 = FileSearcher.GetFilesFast(@"C:\", (f) => f.CreationTime > new DateTime(2018, 1, 10));
            List<FileInfo> resultFiles3 = FileSearcher.GetFilesFast(@"C:\", (f) =>
            {
                return (f.Extension == ".mp3") && (f.Length > 10485760) && (f.CreationTime > new DateTime(2018, 1, 10));
            });
 
            // Использование экземпляра класса FileSearcher позволяет получать результат по мере их нахождения,
            // а также останавливать поиск, не дожидаясь его завершения:
            CancellationTokenSource tokenSource = new CancellationTokenSource();
 
            FileSearcher searcher = new FileSearcher(@"C:\", (f) => Regex.IsMatch(f.Name, @".*Imagine[\S_]Dragons.*.mp3$"), tokenSource);
 
            List<FileInfo> files = new List<FileInfo>();
 
            searcher.FilesFound += (sender, arg) => 
            {
                lock (locker)
                {
                    arg.Files.ForEach((f) =>
                    {
                        files.Add(f);
                        Console.WriteLine($"File location: {f.FullName}, \nCreation.Time: {f.CreationTime}");
                    });
 
                    if (files.Count >= 10)
                        searcher.StopSearch();
                }
            };
 
            searcher.SearchCompleted += (sender, arg) =>
            {
                if (arg.IsCanceled)
                    Console.WriteLine("Search stopped.");
                else
                    Console.WriteLine("Search completed.");
 
                Console.WriteLine($"Quantity of files: {files.Count}");
            };
 
            var task = searcher.StartSearchAsync();
 
            task.Wait();
 
            Console.ReadLine();
        }
    }
}
2
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18240 / 14154 / 5366
Регистрация: 17.03.2014
Сообщений: 28,841
Записей в блоге: 1
15.03.2018, 00:33
VladPVS, тесты на скорость проводил? Насколько быстрее работают Fast методы?
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
15.03.2018, 02:39
Зависит от конфигурации компьютера, конечно. У меня i7 720QM первого поколения, 4ГБ ОЗУ, SSD диск, получается где-то в 2.5-3 раза быстрее. Но смысл есть только на очень больших деревьях каталогов, если директория содержит всего пару десятков поддиректорий, то обычный однопоточный метод может отработать даже немного быстрее.
0
1 / 1 / 0
Регистрация: 11.01.2017
Сообщений: 28
16.04.2018, 23:17
Огромное спасибо за библиотеку, сейчас начал пользоваться и доволен как кот
И то, что пример привели, тоже очень помогло разобраться! Сейчас вот изучаю Вашу библиотеку, уже к курсовой подключил)
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
16.04.2018, 23:38
Delictum, пожалуйста. Я сейчас и сам её использую.
Советую ещё асинхронные методы вызывать с использованием await, т.к. он пробрасывает возможные исключения, иначе их можно пропустить. Например, если при поиске на флешке её выдернуть из USB-порта, как раз и будет сгенерировано исключение.

Кстати, вот тема с обсуждением этой библиотеки: Поиск по всем разделам диска
1
0 / 0 / 0
Регистрация: 23.04.2018
Сообщений: 26
28.04.2018, 06:14
Цитата Сообщение от OwenGlendower Посмотреть сообщение
mrdonald, это недостаток реализации методов поиска файлов в .NET. Если каталог недоступен пользователю (а некоторые каталоги недоступны даже админу), то он падает с исключением. У меня на этот случай есть такой метод SafeEnumerateFiles ...
Почему может выдавать ошибку для SafeEnumerateFiles

Ошибка CS0116 Пространство имен не может напрямую включать в себя такие члены, как поля или методы.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18240 / 14154 / 5366
Регистрация: 17.03.2014
Сообщений: 28,841
Записей в блоге: 1
28.04.2018, 10:26
Sarax, методы нельзя объявлять внутри пространства имен. Размести SafeEnumerateFiles внутри какого-либо класса.
1
0 / 0 / 0
Регистрация: 23.04.2018
Сообщений: 26
28.04.2018, 10:43
А ещё, не подскажите как ваш метод, реализовать под такую кнопку в Windows Forms?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 private void Button1_Click(object sender, EventArgs e)
        {
            
            try
            {
                string[] files = Directory.GetFiles(path: @"C:\Windows\", searchPattern: "*.jpg", searchOption: SearchOption.AllDirectories);
                NewMethod(files: files);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка: " + ex.Message + "" + ex.Source);
 
            }
 
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.04.2018, 10:43
Помогаю со студенческими работами здесь

preg_match_all - Выполняет глобальный поиск шаблона в строке
Народ помогите разобраться не магу понять где косяк. preg_match_all('/\(*)\/i', $content_text, $match); if(count($match) &gt; 0){ ...

Как задать Regexp глобальный поиск по строке?
Добрый день! вопрос такой: мы имеем строку и переменную с каким либо символом, как задать глобальный поиск по строке так чтобы параметром...

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

Глобальный инклюд файла
Всем привет! Возник такой вопрос.. а как мне глобально заинклюдить файл? Подробнее: &lt;?php require_once(&quot;1.php&quot;); ...

Чтение структуры из файла, глобальный указатель
Помогите, пожалуйста! имеется код, имеется файл. код то работает, то нет. причем код при этом не редактируется. выходной эксешник тоже не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru