Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2010, 17:12   #1
KrL^^
Пользователь
 
Регистрация: 01.10.2008
Сообщений: 12
По умолчанию [Delphi] Вычислить расположение и начальный кластер заданного каталога на диске.

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

Мысль такая) В 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^^ вне форума Ответить с цитированием
Старый 13.04.2010, 11:35   #2
KrL^^
Пользователь
 
Регистрация: 01.10.2008
Сообщений: 12
По умолчанию

Хотя бы идею как это должно выглядеть)
KrL^^ вне форума Ответить с цитированием
Старый 22.04.2010, 20:09   #3
KrL^^
Пользователь
 
Регистрация: 01.10.2008
Сообщений: 12
По умолчанию

Такой вопрос)
hDevice:=CreateFile(PChar('\\.\G:\w ork'{'\\.\'+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.
KrL^^ вне форума Ответить с цитированием
Старый 22.04.2010, 20:12   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
что такое кластер??? gaka1995 Компьютерное железо 8 13.12.2009 13:52
Проголосуем ? ) Delphi Coding Styles расположение begin относительно then в условных конструкциях Квэнди Свободное общение 34 15.09.2009 20:22
Начальный уровень C++ Valento Свободное общение 3 15.03.2009 22:27
delphi синтаксический контроль заданного оператора lusuj Помощь студентам 1 10.12.2008 22:42
Как программно через delphi создать папку на диске? VenMaster Общие вопросы Delphi 5 25.05.2008 21:09