Форум: "Основная";
Текущий архив: 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