API файловой системы Windows для запроса больших файлов

#c# #c #performance #filesystems

#c# #c #Производительность #файловые системы

Вопрос:

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

РЕДАКТИРОВАТЬ Если сканирование жесткого диска является единственным вариантом, то что я могу сделать для обеспечения наилучшей производительности. Например — я мог бы пропустить сканирование системных папок, поскольку меня интересуют только пользовательские данные.

Ответ №1:

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

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

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

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

Комментарии:

1. Да, скорость имеет решающее значение, я попробую посмотреть MFT и посмотреть, поможет ли мне индекс размера файла. Я отмечу ваш ответ правильным, как только выполню некоторые базовые действия POC. Спасибо.

Ответ №2:

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

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

Ответ №3:

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

Комментарии:

1. Файловая система этого не делает, но индексатор поиска делает — смотрите мой ответ.

Ответ №4:

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

Возможный способ привязки к индексатору Microsoft