Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
15-1157270119
Dbn
2006-09-03 11:55
2006.09.24
E 1,7e что это за числа?


5-1139839358
Святослав
2006-02-13 17:02
2006.09.24
Как запустить процедуру после установки Parent?


15-1157226865
Cyrax
2006-09-02 23:54
2006.09.24
Программирование и боевые искусства


2-1157225031
Keni
2006-09-02 23:23
2006.09.24
файл в EXE


15-1157610374
Stexen
2006-09-07 10:26
2006.09.24
VS2005