Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вычислить расположение и начальный кластер заданного каталога на диске.  (Прочитано 5689 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
KrL
Участник

ru
Offline Offline

« : 12-04-2010 13:19 » new

Задание: Вычислить расположение и начальный кластер заданного каталога на диске. Прочитать содержимое каталога по всем его кластерам в память.

Мысль такая) В DriveComboBox выбираем диск, в DirectoryListBox каталог. Далее необходимо найти первый кластер каталога, сколько он занимает кластеров и передать в эту процедуру:


Код:
procedure TForm1.Button3Click(Sender: TObject);
var hDevice: THandle;
    mbr: TSectorBuffer;
    Buffer1: String;
    i,j:Byte;
    k:Integer;
begin
  Memo1.Clear;

  hDevice:=CreateFile(PChar('\\.\'+DriveComboBox1.Drive+':'), GENERIC_READ, FILE_SHARE_READ
  or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
  if hDevice = INVALID_HANDLE_VALUE then
  begin Memo1.Lines.Add('Invalid handle name'); Exit; end;

  for k:=SpinEdit1.Value to SpinEdit1.Value+SpinEdit2.Value-1 do
  begin
    if not ReadSector(hDevice, k, mbr) then
    begin Memo1.Lines.Add('Error number '+IntToStr(GetLastError)+'for sec: '+IntToStr(k)); end
    else
    begin
      Memo1.Lines.Add('Sector: '+IntToStr(k));
      Buffer1:='';
      for i:=1 to 32 do
      begin
        for j:=1 to 16 do
        begin
            Buffer1:=Buffer1+IntToHex(mbr[16*(i-1)+j], 2)+' ';
        end;
        Memo1.Lines.Add(Buffer1);
        Buffer1:='';
      end;
    end;
  end;


  CloseHandle(hDevice);
end;

function TForm1.ReadSector(h: THandle; sec: Int64; var buf: TSectorBuffer): Boolean;
var i:DWORD;
begin
  SetFilePointer(h, sec*512, 0, FILE_BEGIN);
  Result := ReadFile(h, buf, SizeOf(buf), i, POverlapped(0));
end;
вместо SpinEdit'ов. Вопрос как?) Не смог найти апи функцию которая это делает((
Записан
KrL
Участник

ru
Offline Offline

« Ответ #1 : 22-04-2010 16:08 » 

Такой вопрос)
hDevice:=CreateFile(PChar('\\.\G:\work'{'\\.\'+DriveComboBox1.Drive+':'}),
   GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
Почему если пишем '\\.\'+DriveComboBox1.Drive+':, т.е. локальный диск, то кластеры читаются нормально, а если мы указываем папку \\.\G:\work (находится на флешке, фат) то получаем хендл, передаем в функцию чтения секторов, но считывается 0 секторов, код ошибки 0. 
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines