Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Работа с Floppy диском


Автор: Delist 25.6.2005, 00:05
Может кто знает, как определить происходит ли сейчас запись данных на флопи или чтение с него.

Заранее благодарен.

Автор: Poseidon 25.6.2005, 00:33
Попробуй пойти на хитрость.
Дело в том, что при чтении (записи) с (на) дискету доступ к ней запрещен. Т.е. если сейчас происходит чтение, то твоя программа получит отказ при обращении к дисководу. Этим и можно воспользоваться. Вот пример:
Код
// функция просто смотрит есть-ли дискета в дисководе.
// в общем-то не важно что она делает
// главное то, что она пытается обратится к дисководу
function IsDrive(Drive: char): boolean;
var
  SectorsPerCluster,
  BytesPerSector,
  NumberOfFreeClusters,
  TotalNumberOfClusters   : Cardinal;
begin
Result := GetDiskFreeSpace(PChar(Drive+':\'),
                            SectorsPerCluster,
                            BytesPerSector,
                            NumberOfFreeClusters,
                            TotalNumberOfClusters);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if IsDrive('A') then ShowMessage('Дисковод свободен') else showMessage('Дисковод занят')
end;

Автор: s-mike 25.6.2005, 07:33
Poseidon, все конечно хорошо, но твоя процедурка будет иметь неадекватную реакцию при отсутствии диска в дисководе. Поэтому лучше так:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  F: TSearchRec;
  OldErrorMode: UINT;
begin
  OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
{$I-}
  if FindFirst('A:\*.*', faAnyFile, F) = ERROR_NOT_READY then
    ShowMessage('Drive is not ready!')
  else
    ShowMessage('Drive is OK!');
  FindClose(F);
{$I+}
  SetErrorMode(OldErrorMode);
end;

Хотя имхо лучше поставить хук на функции копирования.

Автор: Delist 25.6.2005, 14:59
Попрбывал оба примера, однако когда записываю данные на дискету, оба примера говорят, что дискета готовва к работе. Может у кого-нибудь ещё есть идей.


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

Автор: Poseidon 25.6.2005, 17:05
Цитата(s @ 25.6.2005, 07:33)
Poseidon, все конечно хорошо, но твоя процедурка будет иметь неадекватную реакцию при отсутствии диска в дисководе
Действительно. Об этом я только к утру додумался smile

Цитата(Delist @ 25.6.2005, 14:59)
Попрбывал оба примера, однако когда записываю данные на дискету, оба примера говорят, что дискета готовва к работе
Но вот тут не знаю. Я пример s-mike не пробовал, но свой тестил. Все работает как нужно (конечно при условии что дискета в дисководе)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)