Быстрый поиск набора имен файлов на томах NTFS, в идеале через его MFT - PullRequest
5 голосов
/ 17 ноября 2010

Я нахожусь в процессе написания инструмента, который находит потерянные файлы библиотеки iTunes, как для Mac, так и для Windows.На Mac я могу быстро находить файлы по именам, используя замечательную функцию «CatalogSearch».

Однако в Windows, похоже, нет OS API для поиска по имени файла (или есть?).

После некоторого поиска в Google я узнал, что есть инструменты (такие как TFind , Everything ), которые непосредственно читают каталог NTFS и сканируют его, чтобы найти файлы по имени.

Я хотел бы сделать то же самое, но без необходимости начинать с нуля (хотя в прошлом я писал довольно много дисковых инструментов, у меня никогда не было сил копаться в NTFS).

Интересно, есть ли готовые библиотеки, возможно, в виде .dll, которые бы дали мне такую ​​функцию поиска: передайте имя файла, верните его путь.

В качестве альтернативы, как насчетСлужба индексации Windows?По крайней мере, когда я пытался сделать это в недавно установленной системе XP Home, операция Поиск в меню Пуск фактически сканировала бы все каталоги, что предполагает отсутствие полной базы данных.Поскольку я вообще не пользователь Windows, мне интересно, почему это не работает.

В конце концов, мне нужно решение complete : у меня есть список имен файловчтобы найти, и мне нужен код, который ищет весь диск (или использует для этого БД), чтобы получить все результаты за один раз.Например, поиск не должен начинать новое полное сканирование для каждого файла, который я ищу.Вот почему я думаю, что способ MFT будет оптимальным, поскольку он может быстро перебирать все имена, сравнивая каждое из них с моим списком.

1 Ответ

5 голосов
/ 22 ноября 2010

Лучший способ решить вашу проблему - использовать журнал изменений Windows.

Проблема: если он не включен для тома или том не является NTFS, вам нужен запасной вариант (или включить журнал изменений, если это NTFS). Вам также необходимы права администратора для доступа к журналу изменений.

Вы получаете файлы, используя FSCTL_ENUM_USN_DATA и DeviceIOControll с LowUsn = 0. Это напрямую обращается к MFT и записывает все имена файлов в предоставленный буфер. Поскольку он последовательно обращается к MFT, он работает быстрее, чем API FindFirstFile.

...