2012-07-04 2 views
4

Когда журнал USN используется в первый раз, весь набор записей USN должен быть перечислен с помощью управляющего кода FSCTL_ENUM_USN_DATA. Обычно это длительная операция.Оцените количество записей USN на томе NTFS

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

Я предполагаю, что данные USN для всего тома генерируются из MFT с одной записью на файл (приблизительно). Поэтому, возможно, способ оценить количество активных файлов в MFT будет работать.

+0

FSCTL_ENUM_USN_DATA перечисляет содержимое MFT, а не содержимое журнала USN (для которого вы будете использовать FSCTL_READ_USN_JOURNAL). Итак, да, он содержит одну запись для каждого файла и каталога на томе. Я не знаю, как оценить количество записей.Вместо индикатора прогресса или процента, возможно, просто отображение количества файлов/каталогов, обработанных до сих пор? –

+0

Вопрос: почему вы хотите перечислить весь MFT? Это может быть необязательно. Этот ответ может быть полезен: http://stackoverflow.com/a/7459109/886887 –

+0

Это было мое понимание (или, по крайней мере, предположение). Отображение счета может потребоваться, но я по-прежнему открыт для любых предложений для всего, что может даже приблизиться к подсчету. – Edmund

ответ

3

Вы можете использовать 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, чтобы получить процент завершен, до тех пор, пока вы справитесь изящно, если это вернет бессмысленный результат.

+0

Привет, Гарри, я экспериментировал и нашел интересную вещь. FSCTL_ENUM_USN_DATA фактически возвращает смещение MFT в качестве следующего «StartFileReferenceNumber» или USN (в зависимости от того, какая часть документов MSDN вы читаете!). Это число относительно невелико и не имеет отношения к FRN или USN. Так что я сделал, это использовать FSCTL_GET_NTFS_VOLUME_DATA, чтобы получить размер MFT, а затем обработать этот MFT pos как индикатор прогресса. – Edmund

+0

В моей системе (Windows 7 SP1) номер, возвращаемый FSCTL_ENUM_USN_DATA, определенно является ссылочным номером файла. Я бы подумал, что это всегда должно быть, потому что это то, что вы передаете для StartFileReferenceNumber при следующем вызове. В какой ОС вы работаете? (Было бы разумно, чтобы «ссылочный номер» фактически был смещением, но числа, которые я получаю, не являются, потому что они часто последовательны.) –

+0

Это был мой рабочий компьютер, WinXP SP2. Поскольку это не документированное поведение, я, вероятно, не должен полагаться на него, и я думаю, что он не будет работать на 7 (что я попробую). Поля FileReferenceNumber возвращенных записей USN не в порядке (хотя они кажутся приблизительными). – Edmund