Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как обработать исключения при чтении/записи на дискету? [D7, WinXP]


ДЫМ ©   (2004-10-06 03:07:00) 

Казалось бы, что может быть проще, но поди ж ты.
Проблема такова: я в цикле копирую файл через буфер, используя файловые потоки
(при работе с Handle такая же история).
Примерно так (в упрощенном варианте) procedure TForm1.Button1Click(Sender: TObject);
var Stream1,Stream2:TFileStream;
    CopyBuffer:PChar;
    BytesCopied:Integer;
begin
// Создаем потоки для файлов
Stream1:=TFileStream.Create('C:\Test.txt',fmOpenRead);
Stream2:=TFileStream.Create('A:\Test.txt',fmCreate);
Stream1.Seek(0,soFromBeginning);
Stream2.Seek(0, soFromEnd);
// выделяем память под буфер
CopyBuffer:=PChar(AllocMem(1024));

try
 // тут непосредственно копируем
 While Stream1.Position<>Stream1.Size do
   begin
    BytesCopied:=Stream1.Read(CopyBuffer^,1024);
    Stream2.Write(CopyBuffer^,BytesCopied);
   end;

// какое-нибудь сообщение в случае ошибки
except
 ShowMessage('Ошибка!');
end;

FreeMem(CopyBuffer);
Stream1.Free;
Stream2.Free;

А потом вот что:
1) файл, который копируется (C:\Test.txt) весит 1 Mb, на дискете свободно от силы 50 Kb,
  эти 50 килобайт записываются и ВСЁ, никакого исключения не возникает, цикл завершается,
  хотя должно быть что-то вроде "На диске не хватает места";
2) если в процессе копирования вынуть дискету (может и такое быть),
то вообще начинается какая-то вакханалия - выскакикавает диалог с заголовком
"Windows - Устройство не готово", жму <Отмена>, выскакивает точно такой же диалог, но
с заголовком "Project1:Project1.exe - Устройство не готово", а затем уж и вовсе в трее сообщение
"Ошибка отложенной записи ", но НИ ЛОКАЛЬНЫЙ НИ ГЛОБАЛЬНЫЙ обработчики в моем приложении
не срабатывают. (При чем здесь "отложенная запись", её же надо отдельно организовывать через API).

Почему в первом случае не возникает исключения?
Как во втором случае обработать возникшие
исключения непосредственно в приложении, хотя бы после системного обработчика, чтобы
вообще понять - успешно прошло копирование или нет?
(Кстати, система - WinXP)


panov   (2004-10-06 10:47:00) [1]

>TUser ©   (06.10.04 10:44) [3]

Зачем через стримы это делать?

А почему бы и нет? Ничем не хуже.


TUser   (2004-10-06 10:44:00) [2]

ЕЗачем через стримы это делать? Если ты хочешь сам следить за процессом, то см. CopyFileEx.


panov   (2004-10-06 10:19:00) [3]

TFileStream не вызывает Exception.

В цикле при записи нужно контролировать не общий размер ( Stream1.Position<>Stream1.Size)

А размер скопированной порции -

repeat
 BytesReaded := Stream1.Read(CopyBuffer^,1024);
 BytesWrited := Stream2.Write(CopyBuffer^,BytesReaded);
until (BytesWrited=0) or (BytesReaded<>BytesWrited);

if BytesReaded<>0 then 'обработка ошибки'


Warlock   (2004-10-06 06:22:00) [4]

Почему бы не использовать просто CopyFile и GetLastError чтобы ловить ошибку?
Еще есть ShFileOperation (F1 по SHFILEOPSTRUCT))


Наверх

Титульная страница Поиск, карта сайта Написать письмо