Вы можете использовать FSCTL_GET_NTFS_VOLUME_DATA, чтобы получить длину в байтах MFT. Если вы сравните это с количеством записей на выбор репрезентативных томов, вы можете оценить среднюю длину одной записи MFT и использовать ее для вычисления оценки количества записей на определенном томе.
Поскольку MFT содержит (например) информацию о безопасности для каждого файла, средняя длина будет значительно отличаться от объема к тому, поэтому я думаю, что вы получите только порядок величины, но это может быть хорошо достаточно в большинстве случаев.
Другим подходом было бы предположить, что ссылочные номера файлов увеличиваются линейно, что примерно верно. Вы можете использовать FSCTL_ENUM_USN_DATA, чтобы узнать, есть ли файлы с ссылочным номером выше определенного предположения или нет; вам понадобится не более 128 догадок, чтобы определить фактический максимальный ссылочный номер. Это, по крайней мере, даст вам процент от 0 до 100 в любой заданной точке, он не будет полностью единообразным, но никогда не будет индикаторов прогресса. :-)
Дополнительно:
присмотревшись, на Windows 7 x64 поле «следующий идентификатор» возвращаемый FSCTL_ENUM_USN_DATA (квадраслово вернулся до первой структуры USN_RECORD) не является ссылка на файл номер в конце, но номер сегмента записи файла. Итак, как вы заметили, последний номер возвращаемого номера, умноженный на BytesPerFileRecordSegment (1024), равен MftValidDataLength.
Номера ссылок на файлы, как представляется, состоят из двух частей. Низкие шесть байтов содержат номер сегмента записи файла. Первая запись, возвращаемая из каждого запроса, всегда имеет FRN, номер сегмента которого совпадает с «следующим идентификатором», поданным в StartFileReferenceNumber, за исключением первого вызова, когда StartFileReferenceNumber равен нулю. Верхние два байта содержат неопределенную дополнительную информацию, которая никогда не равна нулю.
Кажется, что FSCTL_ENUM_USN_DATA принимает либо файл запись номер сегмента (в этом случае два верхних байт ноль) или ссылка номер файла (в этом случае два верхних байт равен нуль).
Одна из особенностей заключается в том, что я не могу найти две записи с одним и тем же номером сегмента записи. Это говорит о том, что каждая запись файла использует не менее 1K в MFT, что не кажется разумным.
В любом случае, возможно, разумно умножить «следующий id» на BytesPerFileRecordSegment и разделить его на MftValidDataLength, чтобы получить процент завершен, до тех пор, пока вы справитесь изящно, если это вернет бессмысленный результат.
FSCTL_ENUM_USN_DATA перечисляет содержимое MFT, а не содержимое журнала USN (для которого вы будете использовать FSCTL_READ_USN_JOURNAL). Итак, да, он содержит одну запись для каждого файла и каталога на томе. Я не знаю, как оценить количество записей.Вместо индикатора прогресса или процента, возможно, просто отображение количества файлов/каталогов, обработанных до сих пор? –
Вопрос: почему вы хотите перечислить весь MFT? Это может быть необязательно. Этот ответ может быть полезен: http://stackoverflow.com/a/7459109/886887 –
Это было мое понимание (или, по крайней мере, предположение). Отображение счета может потребоваться, но я по-прежнему открыт для любых предложений для всего, что может даже приблизиться к подсчету. – Edmund