Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Разное > Исходники и статьи
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.10.2011, 18:01
Lucky192 Lucky192 вне форума
Прохожий
 
Регистрация: 04.10.2011
Сообщения: 28
Репутация: 1351
Лампочка Исходник - Анализ физического размещения файла на диске

Функция возвращает номер первого кластера первого фрагмента заданного файла. Номера кластеров остальных фрагментов выводятся через OutputDebugString().
Код:
const 
  FSCTL_GET_RETRIEVAL_POINTERS = $90073;

type
  TExt = packed record
    NextVcn: LARGE_INTEGER;
    Lcn:     LARGE_INTEGER;
  end;

  PRETRIEVAL_POINTERS_BUFFER = ^_RETRIEVAL_POINTERS_BUFFER;
  _RETRIEVAL_POINTERS_BUFFER = packed record
    ExtentCount: DWORD;
    StartingVcn: TLargeInteger;
    Extents: array [0..0] of TExt;
  end;

  _STARTING_VCN_INPUT_BUFFER = packed record
    StartingVcn: TLargeInteger;
  end;

function FileAllocation(AFileName:string):cardinal;
var Handle : THandle;
    i,cbBytesReturned : cardinal; 
    ok : boolean;
    iBuf : _STARTING_VCN_INPUT_BUFFER;
    oBuf : array of byte;
    ppointers : PRETRIEVAL_POINTERS_BUFFER;
begin
  Result:=0;
  Handle := CreateFile (PChar(AFileName),0,FILE_SHARE_READ or FILE_SHARE_WRITE,
                        nil,OPEN_EXISTING,0,0);
  if (Handle=INVALID_HANDLE_VALUE) then exit;
  try
    iBuf.StartingVcn := 0;
    SetLength(oBuf,16*1024);
    ok := DeviceIoControl (
                         Handle,
                         FSCTL_GET_RETRIEVAL_POINTERS,
                         @iBuf, sizeof(iBuf),
                         @oBuf[0],  length(oBuf),
                         cbBytesReturned,
                         nil
                       );
    if ok then begin
      ppointers:=@oBuf[0];
      // Возвращаем номер первого кластера файла
      Result := ppointers.Extents[0].Lcn.HighPart;
      // Выводим номера кластеров всех фрагментов файла
      OutputDebugString(PChar('File: '+AFileName));
      for i:=0 to ppointers.ExtentCount-1 do with ppointers.Extents[i] do begin
        OutputDebugString(PChar(Format('VCN: %.8X %.8X  LCN: %.8X %.8X',[NextVcn.HighPart,NextVcn.LowPart,Lcn.HighPart,Lcn.LowPart])));
        Result := Lcn.QuadPart;
      end;
    end
  finally
    CloseHandle(Handle);
  end;
end;
Ради наглядности, в пример сознательно не включена обработка ошибок.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter