2010-11-17 2 views
5

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

В Windows, однако, похоже, что нет API-интерфейса ОС для поиска по имени файла (или есть?).

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

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

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

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

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

+0

Поиск в Windows выполняется быстро, только если вы ищете индексированные местоположения. – MSalters

+0

Я думаю, вы имеете в виду это: http://msdn.microsoft.com/en-us/library/bb266517(v=VS.85).aspx?ppud=4 - выглядит сложным. Спасибо, спасибо. –

+0

Не делайте этого, пожалуйста, пожалуйста. Слушайте парня, который говорит вам использовать журнал USN –

ответ

5

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

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

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

+0

Да, я знаю об этом варианте (он также доступен по OS X по умолчанию с 10,5). Боюсь, что это слишком сложно, чтобы справиться. –

+0

И журнал изменений только дает мне последние изменения, не так ли? Поэтому, если я не буду вести процесс записи всех изменений, мне все равно придется сначала выполнить полное сканирование. Верный? Затем я возвращаюсь к своему первоначальному вопросу: как быстро выполнить полное сканирование? –

+1

Если вы установили StartUSN в ноль, как описано, это даст вам все файлы на томе быстрым способом (и это очень быстро). Если вам нужны изменения, вам нужно установить StartUSN на большее число.Затем вы получаете измененные файлы с того USN. – UrOni