Главная страница
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.035 c
1-1155530573
karton
2006-08-14 08:42
2006.09.24
Компоненты для экспорта из FastReport


2-1157101100
TakTak
2006-09-01 12:58
2006.09.24
время работы в миллисекундах.


15-1157558537
AlexanderMS
2006-09-06 20:02
2006.09.24
Настройка почты.


2-1157009368
Patrick
2006-08-31 11:29
2006.09.24
Access violation...


15-1157038248
Sergey Masloff
2006-08-31 19:30
2006.09.24
offtop:Меломаны, кому нужен бы Atomic Rooster? Их есть у меня