@dzx7271

Как получить цепочку кластеров занимаемых файлом?

Как получить цепочку кластеров занимаемых файлом на DELPHI в FAT32? На вход подается директория (полный путь к файлу), на выходе получаем цепочку кластеров, занимаемых файлом. Я пытаюсь для начала узнать номер первого кластера файла в FAT. С помощью функции
hFile := CreateFile(PChar(‘путь к файлу’),GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);
мы получаем дескриптор типа THandle - 4 байта. Как из него достать нужную информацию о номере начального кластера? Да и в общем как получить дескриптор какого либо файла и распаковать в структуру данных типа record.
Под дескриптор файла в FAT32 без учета LFN отводится 32 байта (прикреплю фото структуры дескриптора файла). Возможно ли вообще из 4-х байтового хэндла вытащить какую либо информацию?
spoiler
65d9cad8c73bc309145751.jpeg
  • Вопрос задан
  • 554 просмотра
Пригласить эксперта
Ответы на вопрос 4
mayton2019
@mayton2019
Bigdata Engineer
Попробуй как-то так:
handle = CreateFile("\\\\.\\PhysicalDriveC", .......);

Это на С++ под Windows. И запускать надо будет под Суперпользователем.

Updated 2/26/2024
Ответ написан
saboteur_kiev
@saboteur_kiev
software engineer
первый кластер лежит в directory entry (вроде 20й байт для FAT32)

остальные кластера вычисляются через FAT (в соответствующем поле будет либо номер следующего кластера этого файла либо FFFFFFFF, который показывает что это последний кластер файла.
Там же в directory entry лежит точный размер файла в байтах, чтобы понять сколько байт нужно дочитать из последнего кластера

Как это делать в дельфи не знаю, но можно почитать датащит по FAT16/FAT32 что именно где лежит в directory entry
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
На то она и файловая система, что скрывает от пользователя, как устроен диск и есть ли вообще диск: может быть сетевая файловая система, могут быть устройства как файлы, а может быть RAID какой-нибудь, когда одни данные на двух дисках.

Насколько мне известно, ни один файловый API не позволяет перейти от высокоуровневого дескриптора до низкоуровневых штучек — во-первых, неуниверсально. Во-вторых, опасно для пользовательских данных, если программа уверена, что знает, а она не знает (например, на диске MyCoolFS 3.15, а программа работает с 3.14). Все программы, работающие с файловой системой как таковой, начинают с разделов диска.

Такая конструкция хотя бы ставит надёжные стены между пользовательскими программами (которые портят данные в крайне редких случаях — скажем, когда выключили комп во время записи) и сервисными утилитами (которые по определению опасны, используйте на свой риск).
Ответ написан
Комментировать
mindtester
@mindtester
http://iczin.su/hexagram_48
был у меня случай - удалили БД 1С (по тем годам аж в ДБФ)... ну и по стечению обстоятельств, нашлись общие знакомые, что предложили обратится ко мне...
- первое требование "диск не трогать, систему не запускать"
- попросил диск и сделал дамп
- знаний о fat32 уже было, так же и о структуре dbf
- комбинаторно перебирал из дампа клочки, которые подходили в сумме, под размер записи
- вышло версий 5 наборов файлов (??? давно было)... увы... ни одна не принесла клиенту счастья

... опустим лирику:
- fat32 достаточно хорошо описан в сети
- требуется физический доступ с высшими привилегиями

то есть или дамп, или вторым диском (а с основного все пытки)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы