MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как узнать, какой файл исправил chkdsk?"
Answer 641829
Насколько я понял
3856B - номер записи в MFT (соответствует полю FILE record number структуры File Reference)
$I30 - указывает на индекс файлов в каталоге (один из типов индексов)
т.е. сообщение значит, что поврежден список файлов в каталоге с указанным номером
Для того, чтобы узнать имя файла по его номеру записи в MFT, в Windows существует команда fsutil file queryfilenamebyid. Проблема в том, что эта команда требует полный ID файла вида 0x7500000000CFCD (состоящий из номера записи и дополнительного однобайтового значения SequenceNumber, которое показывает, сколько раз данная запись была повторно использована), в то время как журнал программы проверки диска возвращает только частичный идентификатор вида 0x00000000CFCD (только номер записи). Теоретически, для идентификации файла достаточно только номера записи, т.к. он представляет собой индекс массива. Дополнительный байт, как я понял, нужен для контроля правильности действий при обращении к повторно используемым записям, поэтому все "высокоуровневные" средства Windows, например WMI, используют полный идентификатор.
Тем не менее, есть способ найти файл и по частичному идентификатору. Для этого понадобится утилита nfi.exe из пакета Windows 2000 OEM Support Tools. К сожалению, сей антиквариат более не доступен с официального сайта, однако на свой страх и риск его можно скачать здесь: Oem3sr2s.zip. Данная консольная утилита позволяет сделать дамп MFT указанного тома. Использование:
nfi.exe (БукваДиска):>filename.txt
Затем в полученном файле надо искать переведенное в десятичную систему значение номера записи из chkdsk. В результате будет найдено что-то такое (для каталога):
File 53197 \foo\bar\catalog\ $STANDARD_INFORMATION (resident) $FILE_NAME (resident) $FILE_NAME (resident) $INDEX_ROOT $I30 (resident)
Примечания
Можно найти файл подбором, вызывайте в цикле команду, пока не получите
%ERRORLEVEL%
равный 0:fsutil file queryfilenamebyid (БукваДиска):\ 0xXX00000012CFCA
где XX изменяется в диапазоне от 00 до FF
При наличии node.js это можно сделать следующим образом:
const spawn = require("child_process").spawnSync; for (var q=0; q<256; ++q) { var id = "0x" + (0+q.toString(16)).slice(-2) + "00000003856B"; var args = ["file", "queryfilenamebyid", "h:\\", id]; if(!spawn("fsutil", args).status) { console.log(id); /* 866-я кодировка не считывается нормально, поэтому перезапускаем */ spawn("fsutil", args, {stdio:'inherit'}); } }
Аналогом
nfi.exe
в Linux является утилитаntfsls
, запущенная с ключом -i
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.