Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
 Аватар для XhonoRjke
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125

Поиск по всем разделам диска

17.03.2018, 12:16. Показов 6361. Ответов 69
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Нашел код поиска файлов по названиям или форматам. Но почему он ищет только в системных папках?
Windows или Users, а по обычным ничего не выдаёт. Помогите разобраться)

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
       private void button9_Click(object sender, EventArgs e)
        {
            var results = MySearcher.GetFiles(@"C:\", "test|*.jpg");
            foreach (var result in results)
            {
                //Console.WriteLine(result.Name);
                richTextBox1.AppendText(result.FullName);
                richTextBox1.AppendText("\n");
                richTextBox1.Refresh();
            }
        }
 
        public static class MySearcher
        {
            private static readonly string[] Splitter = { "|" };
            public static IEnumerable<FileInfo> GetFiles(string path, string mask)
            {
                var maskArray = mask.Replace("*", ".+").Split(Splitter, StringSplitOptions.RemoveEmptyEntries).Select(x => "(" + x + ")");
                var pattern = string.Join("|", maskArray);
                var regex = new Regex(pattern);
 
                string[] entries;
                try
                {
                    entries = Directory.GetFileSystemEntries(path);
                }
                catch (UnauthorizedAccessException)
                {
                    yield break;
                }
                foreach (string entry in entries)
                {
                    var fi = new FileInfo(entry);
                    if (fi.Attributes.HasFlag(FileAttributes.Directory))
                        foreach (var fileInfo in GetFiles(entry, mask))
                        {
                            yield return fileInfo;
                        }
                    else if (regex.IsMatch(entry))
                        yield return fi;
                }
            }
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.03.2018, 12:16
Ответы с готовыми решениями:

Как изменить и применить вид папок ко всем разделам и подразделам, в т.ч. и флешкам
Как изменить и применить вид папок КО ВСЕМ РАЗДЕЛАМ и подразделам, в т.ч. и во флешках и т.д. надоедает менять виды папок в...

Доступ пользователей у разделам жесткого диска!
Народ помогите плз! Такая ситуация с раздела D могу прочитать ин-цию а удалить, добавить или заменить не как, в свойствах любого файла...

Какие права пользователей назначаются по-умолчания разделам жесткого диска после установки windows?
Здравствуйте. Какие права пользователей назначаются по-умолчания разделам жесткого диска после установки винды(7)? Сколько пользователей...

69
 Аватар для XhonoRjke
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
18.03.2018, 15:05  [ТС]
Студворк — интернет-сервис помощи студентам
Например Cheat, Assembly, CC, Crazy;

Но тогда прийдется вручную же вбивать диски все равно. Или нет?
Просто нужные мне файлы, которые нужно найти, могут быть и на флешке. А там с буквой диска не угадаешь. Или я что-то не понимаю?
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
18.03.2018, 15:21
Если слова нужно откуда-то вводить, то прежде следует их сохранить в какой-то массив или список и проверять их в лямбда-выражении.
Вроде такого:

C#
1
2
3
4
5
6
7
8
9
 List<string> keywords = new List<string>(); // список ключевых слов
 
            searcher = new FileSearcher(@"C:\", (f) =>
            {
                foreach (var keyword in keywords)
                    if (Regex.IsMatch(f.Name, keyword))
                        return true;
                return false;
            }, tokenSource);
Добавлено через 3 минуты
По поводу поиска по всем дискам, это не самый тривиальный момент, я примерно представляю как можно реализовать последовательно или параллельно поиск по всем дискам, но в двух словах тут не объяснить, это нужно реализовывать, тестировать, а только потом уже советовать.
0
 Аватар для XhonoRjke
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
18.03.2018, 17:47  [ТС]
VladPVS, параллельный поиск можно реализовать только в вашей библиотеке? или у меня тоже можно найти выход?
0
 Аватар для XhonoRjke
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
18.03.2018, 17:53  [ТС]
Просто интересно, почему он видит диски как на скрине внизу, но не хочет выполнить поиск по этим дискам. Или он видет его как: C:\F:\D:\ поэтому не может определить что и как)
Миниатюры
Поиск по всем разделам диска  
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
18.03.2018, 18:07
Видимо, F: - это дисковод.
Можно создать несколько экземпляров FileSearcher с разными параметрами стартового каталога поиска и запустить их методы StartSearch(), они будут выполняться одновременно, но, если пока нет даже базовых знаний многопоточности, то лучше за это не браться, так как синхронизация потоков - не совсем очевидная вещь. Пока лучше ограничиться поочерёдным выбором каждого диска.

Добавлено через 4 минуты
Да, и foreach'ем так пройтись нельзя, как в коде из первого сообщения. Там то метод IEnumerable<FileInfo> возвращал, а здесь вообще создаётся объект.

В общем, нужно создавать экземпляр класса FileSearcher и запускать его метод StartSearch() для каждого отдельного поиска.
0
 Аватар для XhonoRjke
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
18.03.2018, 20:13  [ТС]
Надо для начала узнать какие есть на ПК диски, а потом уже для них делать отдельный процесс StartSearch(). но блин) Это глупо наверное)
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
18.03.2018, 20:20
Примерно так и можно сделать, только среди всех дисков отделить дисководы всякие.
Вообще, если нужно запустить поиск и забыть, то это вполне рабочий вариант, но если ещё нужно сохранить возможность отмены и уведомления о завершении, то тут уже появляется ряд преград. Лучше, конечно, реализовать такую возможность в классе библиотеки, чем извне, так как там гораздо проще контролировать задачи. Я постараюсь в ближайшее время реализовать возможность поиска по нескольким каталогам.
0
 Аватар для XhonoRjke
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
18.03.2018, 20:35  [ТС]
Остановить процесс можно просто закрыв программу) это не проблема)
Было бы супер если бы вы модифицировали так свой библиотеку)

Неужели я сам разобрался как запихнуть по вашему совету поиск нескольких файлов одновременно)
Офигеть) Учусь)
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
18.03.2018, 20:37
Каким именно образом? Можно посмотреть?

Добавлено через 51 секунду
Кстати, просто закрыв программу во время поиска, можно получить Exception.
0
 Аватар для XhonoRjke
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
19.03.2018, 00:51  [ТС]
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
           CancellationTokenSource tokenSource = new CancellationTokenSource();
 
            List<string> keywords = new List<string>() { "Cheat", "Client", "Xhonor", "Skype", "Discord" };
 
            searcher = new FileSearcher(@"D:\", (f) =>
            {
                foreach (var keyword in keywords)
                    if (Regex.IsMatch(f.Name, keyword))
                        return true;
                return false;
            }, tokenSource);
 
            List<FileInfo> files = new List<FileInfo>(); // список результатов
 
            object locker = new object();
            searcher.FilesFound += (sndr, arg) =>
            {
                lock (locker)
                {
                    Invoke((Action)(() =>
                    {
                        arg.Files.ForEach((f) =>
                        {
                                files.Add(f);
                                richTextBox1.AppendText($"{f.FullName} | {f.LastWriteTime}" + Environment.NewLine);
                                richTextBox1.SelectionStart = richTextBox1.Text.Length;
                                richTextBox1.ScrollToCaret();
                            //richTextBox1.AppendText($"Расположение: {f.FullName}, \nДата создания: {f.CreationTime}");
                        });
                    }));
 
                    //if (files.Count >= 1000)
                    //searcher.StopSearch(); // останавливаем поиск досрочно
                }
            };
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
19.03.2018, 13:37
Лучший ответ Сообщение было отмечено XhonoRjke как решение

Решение

locker лучше вынести на уровень класса и сделать static и private.

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

Таким образом, добавлены 2 класса: FileSearcherMultiple и DirectorySearcherMultiple, позволяющие выполнять поиск по нескольким каталогам. Базовую корректность их работы проверено, но тестировать их ещё придётся. Новая версия библиотеки выложена на GitHub, загрузить можно по ссылке: https://github.com/VladPVS/Fas... y/releases
1
 Аватар для XhonoRjke
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
19.03.2018, 18:05  [ТС]
Супер) Спасибо)
Чуть позже начну тестировать по полной!

Добавлено через 4 часа 12 минут
C#
1
2
3
4
5
6
7
            searcher = new FileSearcher(@"D:\", (f) =>
            {
                foreach (var keyword in keywords)
                    if (Regex.IsMatch(f.Name, keyword))
                        return true;
                return false;
            }, tokenSource);
Не совсем понимаю как внедрить ваш новый код поиска на всех дисках в код выше.

Обычной заменой FilerSearcher на FileSearcherMultiple естественно ничего не выходит, т.к. функционал отличается чуть чуть)
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
19.03.2018, 18:11
Ну конечно, вместо строки, нужно передать список строк, там же в документации всё есть. А подсказки всплывающие с описанием классов, методов, параметров и т.д. появляются?
C#
1
2
3
List<string> folders = new List<string> { @"C:\", @"D:\" };
 
FileSearcherMultiple searcher = new FileSearcherMultiple(folders, (f) => { return f.Name.EndsWith(".mp4"); }, tokenSource);
Кстати, запустив приложение без отладки (Ctrl+F5) поиск будет работать несколько быстрее.
0
 Аватар для XhonoRjke
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
19.03.2018, 18:36  [ТС]
Тьфу) Нет подсказка не вылезла, ток когда сам открыл ее в ссылках.

Спасибо) Действительно быстрее)
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
19.03.2018, 18:38
А .xml файл прикрепили к проекту или только .dll?
Ну и как, работает как следует?
0
 Аватар для XhonoRjke
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
19.03.2018, 18:48  [ТС]
Все прикрепил, все работает прекрасно. Без тормозов и косяков.

Добавлено через 3 минуты
Единственное опять не получится так сделать(
C#
1
2
3
4
5
foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                string driveRoot = drive.RootDirectory.FullName;
                List<string> folders = new List<string> { driveRoot };
}
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
19.03.2018, 18:49
И поиск на нескольких дисках осуществляется?

Не по теме:

Всё, пора значит монетизировать или даже "купюризировать" библиотеку. Пока бесплатно - никому не нужна, а как будет платная - начнут искать где б скачать ломанную, чтоб сэкономить.

0
 Аватар для XhonoRjke
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
19.03.2018, 18:54  [ТС]
Да, на обоих дисках указанных мной ищет)

Не по теме:

Вы правы, оно того стоит

0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
19.03.2018, 18:55
Можно попробовать нечто вроде такого:
C#
1
2
3
4
5
6
7
8
9
            List<string> folders = new List<string>();
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                if (drive.IsReady)
                {
                    string driveRoot = drive.RootDirectory.FullName;
                    folders.Add(driveRoot);
                }
            }

Не по теме:

Знать бы как.

1
 Аватар для XhonoRjke
1 / 1 / 2
Регистрация: 02.09.2010
Сообщений: 125
19.03.2018, 21:26  [ТС]
Все работает, ищет на всех дисках, даже на флешках. Поиск 5ти ключевых слов с отладкой на двух дисках + флешка занимает 10 секунд.
При том, что один из дисков не SSD.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.03.2018, 21:26

Поиск файлов по нескольким разделам
Помогите пожалуйста переделать код, чтобы поиск был по нескольким разделам с несколькими расширениями. Т.е. искало на диске A, B, C по...

Как обойти поиск по разделам?
Здравствуйте скажите пожалуйста как обойти поиск по разделам ?? изначально дет выборка по разделам и только потом идет поиск в этом...

Не могу разобраться с PostgreSQL. Поиск по всем таблицам и всем полям?
Вообщем у меня следующая проблема... подскажите как сделать поиск по во всех таблицах базы и во всех полях каждой таблицы? в моем...

Поиск по всем полям
Здравствуйте. Раньше вел базу таблицу в excel, но сейчас хочу перейти на Access, т.к. думаю больше удобства будет для заполнения и...

Поиск по всем запросам
Уважаемые Гуру, подскажите можно или нет организовать поиск поля по всем запросам бд. Если можно, то как это сделать?


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru