Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Вниз

Проблема с копированием файлов   Найти похожие ветки 

 
TAS ©   (2006-08-09 16:01) [0]

Проблема состоит в следующем:

Есть такая процедура, которая копирует файлы:


TCallBack = procedure (Position, Size: Longint);

procedure FastFileCopy(const InfileName, OutFileName: string; CallBack: TCallBack);
const
 BufSize = 3*4*4096; { 48Kbytes}
type
 PBuffer = ^TBuffer;
 TBuffer = array [1..BufSize] of Byte;
var
 Size : integer;
 Buffer : PBuffer;
 infile, outfile : file;
 SizeDone, SizeFile: Longint;
begin
 if (InFileName <> OutFileName) then
 begin
   buffer := nil;
   AssignFile(infile, InFileName);
   System.Reset(infile,1);
   try
     SizeFile := FileSize(infile);
     AssignFile(outfile, OutFileName);
     System.Rewrite(outfile, 1);
     try
       SizeDone := 0; New(Buffer);
       repeat
         BlockRead(infile, Buffer^, BufSize, Size);
         Inc(SizeDone, Size);
         CallBack(SizeDone, SizeFile);
         BlockWrite(outfile,Buffer^, Size)               //*
       until Size<BufSize;
       FileSetDate(TFileRec(outfile).Handle,
       FileGetDate(TFileRec(infile).Handle));
     finally
       if Buffer <> nil then
         Dispose(Buffer);
       System.closefile(outfile)
     end;
   finally
     System.closefile(infile);
   end;
 end
end;


Если при попытке скопировать файл с моего компьютера в расшаренную папку другого отваливается сеть (строка //*), то появляется сообщение:
Windows - Ошибка отложенной записи.
Не удалось сохранить все данные файла xxx.xxx. Часть данных может быть потеряна.

и т.д.

В самой программе ошибки не возникает и она продолжает отсылать файл дальше.

Проблемы:
1. При обрыве сети в программе не возникает ошибки, следовательно, я не могу обработать это событие и, как следствие, остановить программу и узнать точный объем переданной информации.
2. Появляется сообщение об ошибке, которое я не знаю как убрать.
3. В редких случаях появляется синий экран.

Поспособствуйте решению проблем. Спасибо.


 
clickmaker ©   (2006-08-09 16:15) [1]

если хочешь совсем фаст, то лучше API

hIn := CreateFile(...)
hOut := CreateFile(OutFileName, GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_ALWAYS,
FILE_FLAG_NO_BUFFERING or FILE_FLAG_WRITE_THROUGH,  // отключаем кэш для сетки
0);

while (...)
do begin
 ReadFile(hIn,...
 WriteFile(hOut, ...
end;

Буфер лучше выделить один раз - уменьшишь накладные расходы


 
clickmaker ©   (2006-08-09 16:54) [2]

да, для файла-источника еще полезно включить флажок FILE_FLAG_SEQUENTIAL_SCAN


 
TAS ©   (2006-08-10 11:18) [3]

Спасибо!

Вот еще вопрос:

const
 BufSize = 3*4*4096; { 48Kbytes}
type
 PBuffer = ^TBuffer;
 TBuffer = array [1..BufSize] of Byte;
var
 Size : LongInt;
 Buffer : PBuffer;
 infile, outfile : HWND;
 SizeDone, SizeFile: Longint;
......
 ReadFile(infile,Buffer,BufSize,Size,nil);
// Ошибка: Types of actual and formal var parameters must be identical
......


Что не так?


 
Slym ©   (2006-08-10 11:21) [4]

array [0..BufSize]


 
MBo ©   (2006-08-10 11:22) [5]

Size: DWord


 
MBo ©   (2006-08-10 11:24) [6]

и использовать в функции не указатель, а  Buffer^


 
clickmaker ©   (2006-08-10 11:31) [7]


> infile, outfile : HWND;

для проги непринципиально, но для читаемости лучше THandle или Cardinal.
HWND - тип для дескриптора окна


 
TAS ©   (2006-08-10 11:45) [8]

Спасибо



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

Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.056 c
15-1157358948
Crazy monkey
2006-09-04 12:35
2006.09.24
Как отправить СМС из Латвии в Россию?


15-1157186344
Vlad
2006-09-02 12:39
2006.09.24
Wi-Fi точки доступа


15-1157131916
Dbn
2006-09-01 21:31
2006.09.24
Проблема с компом, точнее с подключеним в интернет.


15-1157635293
Megabyte
2006-09-07 17:21
2006.09.24
Вопрос: Основные схемы построения СУБД?


2-1157366364
DelphiLexx
2006-09-04 14:39
2006.09.24
Lookup лист





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