Как получить список кластеров, занимаемых файлом на диске в формате FAT32 с помощью кода на Delphi?

Как извлечь номер первого кластера файла из 4-байтового дескриптора файла в FAT32, используя функцию CreateFile()? Как также можно разобрать дескриптор файла и преобразовать его в структуру данных типа record? Возможно ли извлечь необходимую информацию о номере начального кластера из 4-байтового дескриптора?
  • 24 февраля 2024 г. 10:58
Ответы на вопрос 2
Для получения списка кластеров, занимаемых файлом на диске в формате FAT32 с помощью Delphi, можно использовать следующий код:

```delphi
procedure GetClustersList(const FileName: string);
var
  FileHandle: THandle;
  BytesRead: DWORD;
  BuffSize: DWORD;
  FirstCluster: DWORD;
  Cluster: DWORD;
  ClusterEntry: DWORD;
  CurrentCluster: DWORD;
  ClustersList: TStringList;
begin
  FileHandle := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
  if FileHandle = INVALID_HANDLE_VALUE then
  begin
    ShowMessage('Error opening file');
    Exit;
  end;

  BuffSize := SizeOf(ClusterEntry);
  SetLength(ClustersList, 0);
  
  // Чтение номера первого кластера из дескриптора файла
  ReadFile(FileHandle, FirstCluster, BuffSize, BytesRead, nil);
  
  CurrentCluster := FirstCluster;
  ClustersList := TStringList.Create;
  ClustersList.Add(IntToStr(CurrentCluster));
  
  // Поиск следующих кластеров файла
  repeat
    ClusterEntry := ReadFATEntry(CurrentCluster);
    Cluster := ClusterEntry and $0FFFFFFF;
    if (Cluster >= 0x0FFFFFF8) or (Cluster = 0) then
      Break;
    ClustersList.Add(IntToStr(Cluster));
    CurrentCluster := Cluster;
  until False;
  
  CloseHandle(FileHandle);

  // Вывод списка кластеров файла
  ShowMessage('Clusters list: ' + ClustersList.CommaText);
end;
```

Для извлечения номера первого кластера файла из 4-байтового дескриптора в FAT32 можно использовать функцию `ReadFile()`, как показано в примере выше. Для разбора дескриптора файла и преобразования его в структуру данных типа record, необходимо определить структуру файла в соответствии с форматом FAT32 и использовать операции чтения байтов из дескриптора.

Извлечь необходимую информацию о номере начального кластера из 4-байтового дескриптора можно путем чтения первых байтов дескриптора и извлечения номера кластера из соответствующих битов.
На то она и файловая система, что скрывает от пользователя, как устроен диск и есть ли вообще диск: может быть сетевая файловая система, могут быть устройства как файлы. 

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

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