API файловой системы Windows для запроса больших файлов - PullRequest
4 голосов
/ 07 мая 2011

У меня есть жесткий диск (скажем, 1 ТБ) с разделами FAT32 и NTFS, и у меня нет информации о том, где на нем хранятся все файлы, но при необходимости я хочу быстро получить доступ к большим файлам, скажем, более 500 МБ. Я не хочу сканировать весь жесткий диск, так как это занимает много времени. Мне нужны быстрые результаты. Мне было интересно, есть ли какие-либо API-интерфейсы NTFS / FAT32, которые я могу напрямую вызвать - я имею в виду, если у них есть какие-то метаданные о файлах, которые хранятся, тогда это будет быстрее. Я хочу написать свою программу на C ++ и C #.

EDIT Если сканирование жесткого диска является единственным вариантом, то что я могу сделать, чтобы обеспечить наилучшую производительность. Как - я мог пропустить сканирование системных папок, так как меня интересуют только пользовательские данные.

Ответы [ 4 ]

3 голосов
/ 07 мая 2011

Если вы хотите ориентироваться на Vista и более поздние версии, вы можете использовать API поискового индексатора.

Если вы посмотрите здесь , вы можете найти информацию о поисковом индексаторе.Поисковый индексатор индексирует размер файла, поэтому он может делать то, что вы хотите.

2 голосов
/ 07 мая 2011

Ваша единственная молитва - привязаться к индексатору файлов, в противном случае вам придется перебирать все файлы.В зависимости от вашего компьютера, вы можете привязаться к собственному индексатору Microsoft (searchindexer.exe) или, если у вас есть поиск Google Desktop, вы можете привязаться к нему.Индексатор Microsoft

2 голосов
/ 07 мая 2011

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

Давайте начнем с FAT32. FAT (в общем, не только 32-битный вариант) назван в таблице размещения файлов. Это блок данных в начале раздела, который сообщает, какие кластеры в разделе принадлежат каким файлам. FAT в основном организован как связанные списки кластеров. Если вы просто хотите найти областей данных для больших файлов, вы можете прочитать FAT в виде числа необработанных секторов и отсканировать эти данные, чтобы найти связанные списки из более чем X кластеров (где X определяет нижний предел для того, что вы считаете большим файлом). Затем вы можете получить доступ к этим кластерам и увидеть фактические данные, связанные с каждым файлом. Как ни странно, вы не узнаете , что это имя этого файла. Имена файлов содержатся в каталогах, которые в основном похожи на файлы, за исключением того, что они содержат записи фиксированного размера указанного формата. Вы должны начать с корневого каталога и прочитать дерево каталогов, чтобы найти имена файлов.

NTFS и проще, и сложнее. NTFS имеет таблицу основных файлов (MFT), которая содержит записи для всех файлов в разделе. Хорошим моментом является то, что вы можете прочитать MFT и получить информацию о каждом файле на диске, не гоняясь по дереву каталогов, чтобы получить его. Плохо то, что декодирование содержимого раздела NTFS определенно нетривиально. Чтение данных (многозначительно) довольно сложно - а запись данных намного больше сложно. Кроме того, в последних версиях Windows были добавлены дополнительные ограничения для необработанного чтения с дисковых разделов, поэтому в зависимости от того, какой раздел вы ищете, вы вообще не сможете получить доступ к нужным данным.

Однако ничего из этого не является чем-то более чем минимально поддерживаемым. Для этого вы открываете файл с именем «\. \ D:» (где D = буква диска, который вам нужен). Затем вы можете прочитать сырые сектора с этого диска (при условии, что его открытие сработало) Это позволит вам видеть необработанные данные для всего диска (или раздела, в зависимости от обстоятельств), начиная с загрузочного сектора и проходя через все остальное, что есть (FAT, корневой каталог, подкаталоги и т. Д. - все как сектора необработанных данных). Система позволит вам читать необработанные данные, но вся ответственность за понимание этих данных лежит на вас на 100%. Если скорость, о которой вы спрашивали, является абсолютной необходимостью, это может быть возможным, но для томов FAT потребуется значительное количество работы, а для NTFS - значительно больше. Если вы действительно не нуждаетесь в дополнительной скорости, как вы сказали, вероятно, даже не стоит задумываться об этом.

2 голосов
/ 07 мая 2011

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

...