Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.042 c
14-1095855143
by
2004-09-22 16:12
2004.10.17
Документрирование и "дурно пахнущий код".


4-1095389264
BorisMor
2004-09-17 06:47
2004.10.17
Окно без бордюра, но ресайзится.


3-1095518436
Irmantukas
2004-09-18 18:40
2004.10.17
Свой индекс


6-1092020633
Максим
2004-08-09 07:03
2004.10.17
Имя компа


6-1091819057
Nill
2004-08-06 23:04
2004.10.17
Шары





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский