Главная страница
    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.45 MB
Время: 0.025 c
1-1096820240
M-Alex
2004-10-03 20:17
2004.10.17
Command


14-1096438928
Holy
2004-09-29 10:22
2004.10.17
И как вам?


4-1095240975
xman
2004-09-15 13:36
2004.10.17
HDD


4-1094851020
массив
2004-09-11 01:17
2004.10.17
Как определить время простаивания системы для Win9x ?


14-1096338106
saysu
2004-09-28 06:21
2004.10.17
Multitier technologies versus (Кто выиграет?)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский