Главная страница
    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.035 c
14-1096024805
VEG
2004-09-24 15:20
2004.10.17
Посоветуйте Flash Player


3-1095339077
Новенький
2004-09-16 16:51
2004.10.17
Печать DBGrid


1-1096618595
Skywalker
2004-10-01 12:16
2004.10.17
Синхронизация доступа в нитях


1-1096999542
BDenis
2004-10-05 22:05
2004.10.17
Каким образом лучше хранить разнотипные данные в одном файле?


14-1096202526
Comp
2004-09-26 16:42
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский