Главная страница
    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.046 c
2-1156798275
RASkov
2006-08-29 00:51
2006.09.24
Сохранение произвольных данных с BitMap ом


6-1137340395
WebSQLNeeder
2006-01-15 18:53
2006.09.24
Как програмно отключить текущее соединение с интернетом??


2-1157017070
BronOS
2006-08-31 13:37
2006.09.24
доступ к объекту на форме MDI Child


1-1155712716
Sniper
2006-08-16 11:18
2006.09.24
Изменяющиеся свойства подкласса


15-1157197093
Stexen
2006-09-02 15:38
2006.09.24
VC++ и дельфи





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