Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
ВнизКак обработать исключения при чтении/записи на дискету? Найти похожие ветки
← →
ДЫМ (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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.035 c