Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

Как обработать исключения при чтении/записи на дискету?   Найти похожие ветки 

 
ДЫМ   (2004-10-06 03:07) [0]

Казалось бы, что может быть проще, но поди ж ты.
Проблема такова: я в цикле копирую файл через буфер, используя файловые потоки
(при работе с 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)


 
Warlock ©   (2004-10-06 06:22) [1]

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


 
panov ©   (2004-10-06 10:19) [2]

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 "обработка ошибки"


 
TUser ©   (2004-10-06 10:44) [3]

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


 
panov ©   (2004-10-06 10:47) [4]

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.10.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.052 c
1-1096030574
misha123
2004-09-24 16:56
2004.10.17
утечка памяти


3-1095829971
RavenD
2004-09-22 09:12
2004.10.17
Почему двойной Last?


1-1096456972
Dr.Karter
2004-09-29 15:22
2004.10.17
Че-то MDI меня не понимает...


3-1095427841
denis24
2004-09-17 17:30
2004.10.17
*.gdb


1-1096362059
VasyaPupkin
2004-09-28 13:00
2004.10.17
DelphiX