Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с копированием файлов [D7, Win2k]


TAS ©   (2006-08-09 16:01:00) 

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

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


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. В редких случаях появляется синий экран.

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


TAS   (2006-08-10 11:45:00) [1]

Спасибо


clickmaker   (2006-08-10 11:31:00) [2]


> infile, outfile : HWND;

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


MBo   (2006-08-10 11:24:00) [3]

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


MBo   (2006-08-10 11:22:00) [4]

Size: DWord


Slym   (2006-08-10 11:21:00) [5]

array [0..BufSize]


TAS   (2006-08-10 11:18:00) [6]

Спасибо!

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

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
......


Что не так?


clickmaker   (2006-08-09 16:54:00) [7]

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


clickmaker   (2006-08-09 16:15:00) [8]

если хочешь совсем фаст, то лучше 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;

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо