Самый эффективный способ поиска файлов - PullRequest
2 голосов
/ 24 октября 2011

Я пишу программу, которая ищет и копирует mp3-файлы в указанную директорию.

В настоящее время я использую Список, который заполнен всеми mp3-файлами в каталоге (что, что неудивительно, занимает очень много времени). Затем я использую taglib-sharp для сравнения ID3Tags с указанным исполнителем и названием. Если они совпадают, я копирую файл.

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

Редактировать: я забыл добавить важную деталь: я хочу иметь возможность указывать, какие каталоги следует искать при каждом запуске поиска (каталог, который нужно найти, будет указан в самой программе). Поэтому хранить все файлы в базе данных или чего-то подобного на самом деле не вариант (если нет способа сделать это каждый раз, который все еще эффективен). Я в основном ищу лучший способ поиска по всем файлам в каталоге, где файлы индексируются каждый раз. (Я знаю, что это, вероятно, не очень хорошая идея, но я хотел бы сделать это таким образом. Если нет реального способа сделать это, мне придется пересмотреть, но сейчас я хотел бы сделать это так .)

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

Вы в основном обременены узким местом, которое является IO, следствием аппаратного обеспечения, с которым вы работаете. Это будет копирование файлов, которое здесь является знаменателем (кроме поиска файлов, которое затмевается по сравнению с копированием).

- это другие способы управления файлами, каждый из которых предлагает более совершенные интерфейсы для различных целей, например Журналы изменений NTFS и низкоуровневая обработка секторов (не рекомендуется) для например, но если это ваша первая программа на C #, то, возможно, вы не хотите рисковать п / вызовом нативных вызовов.

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

1 голос
/ 24 октября 2011

Используйте базу данных (простой двоичный сериализованный файл или встроенную базу данных, такую ​​как RavenDb) для кэширования всех файлов.И запросите этот кеш вместо этого.

Также сохраните измененное время для каждой папки в базе данных.Сравнивайте время в базе данных с временем в папке каждый раз, когда вы запускаете свое приложение (и синхронизируете измененные папки).

Это должно повысить производительность.Многопоточность на самом деле не поможет в поиске папок, так как для ввода-вывода требуется время, а не для вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...