最快的文件拷贝如何做? (100分)

  • 主题发起人 主题发起人 苍蝇拍子
  • 开始时间 开始时间

苍蝇拍子

Unregistered / Unconfirmed
GUEST, unregistred user!
效率最高,速度最快,请大侠帮忙
 
function CopyFile(SourceName,TargetName:String):Boolean;
var
F:TShFileOpStruct;
begin
F.wnd:=InputForm.Handle;
F.wFunc:=FO_COPY;
F.pFrom:=PChar(SourceName+#0#0);
F.pTo:=PChar(TargetName+#0#0);
F.fFlags:=FOF_ALLOWUNDO OR FOF_RENAMEONCOLLISION;
result:= ShFileOperation(F)=0;
end;
 
var
FLoadsteam: TFileStream;
FcopySteam: TFileStream;
buffer: array[0..1023] of char;
begin
FLoadsteam := TFileStream.Create('F:/QQ/034/Wrox - Professional C# (C#高级编程).pdf',fmOpenRead);
FcopySteam := TFileStream.Create('F:/QQ/034/复制文件(C#高级编程).pdf',fmCreate);
ProgressBar1.Max := FLoadsteam.Size;
ProgressBar1.Position := 0;
while FLoadsteam.Position < FLoadsteam.Size do
begin
FLoadsteam.Read(buffer,1024);
FcopySteam.WriteBuffer(buffer,1024);
ProgressBar1.Position := FLoadsteam.Position;
end;
FcopySteam.Free;
FLoadsteam.Free;
end;
kk2000给你介绍的,你看看怎么样
 
The CopyFile function copies an existing file to a new file.

BOOL CopyFile(

LPCTSTR lpExistingFileName, // pointer to name of an existing file
LPCTSTR lpNewFileName, // pointer to filename to copy to
BOOL bFailIfExists // flag for operation if file exists
);


Parameters

lpExistingFileName

Points to a null-terminated string that specifies the name of an existing file.

lpNewFileName

Points to a null-terminated string that specifies the name of the new file.

bFailIfExists

Specifies how this operation is to proceed if a file of the same name as that specified by lpNewFileName already exists. If this parameter is TRUE and the new file already exists, the function fails. If this parameter is FALSE and the new file already exists, the function overwrites the existing file and succeeds.



Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
 
dbb2tkw所说的API函数,应该是最快的吧?
 
  CopyFile 肯定快了! 我做的那个只是为了用进度条显示。
 
我准备做几种函数的性能(SDK API)测试,测试结果回公布给大家
 
也和 磁盘 及文件 位置 排列 有关系
 
[vividw] : 能否细谈?
 
初步测试结果:windows.copyfile(),胜出,100M最快7秒,最慢16秒
奇怪,其他几种都在15~20秒小范围波动,为什么,copyfile波动这么大呢?
 
对于copyfile()函数的几个问题:
1)为什么这个算法要比其他的快许多;
2)为什么一上来新文件的大小就是100M,而不是象其他函数几十K,几百K一点点增加

有知道的吗?
 
应该从 看些磁盘硬件结构。
现在的 磁盘有缓存 一般是先写入缓存 由 缓存写入硬盘。
读写速度的提高是与硬件和文件结构 有关的
如果是一个分区(fat32)上的 文件移动 直接更改 文件分配表。
 
8MB磁盘缓存提供了比以往通常使用的2MB硬盘更高的数据cache命中率,从而显著减少了磁盘数据延迟时间。一般来说,大缓存总是有利于帮助硬盘提高传输速度,这是由于大容量缓存可以存储更多常用的数据,从而让硬盘减少读写时间,如果数据量大的话,也可以减少因为机械操作而造成的传输延迟。相对而言,存取的连续数据量越少,大缓存对磁盘性能的提升就越明显,反之则性能提升不明显.
 
用文件流(已经有人讲过了)
 
我采用多线程方式做的,还是没有源系统带的copy快,不知为何?
 
硬盘的数据传输带宽有限,难以有大幅度的提高的
 
个人认为BlockRead和BlockWrite最快,请楼主测试
var
FromF, ToF: file;
NumRead, NumWritten: Integer;
Buf: array[1..2048] of Char;
begin
if OpenDialog1.Execute then begin
AssignFile(FromF, OpenDialog1.FileName);
Reset(FromF, 1); { Record size = 1 }
if SaveDialog1.Execute then { Display Save dialog box}
begin
AssignFile(ToF, SaveDialog1.FileName); { Open output file }
Rewrite(ToF, 1); { Record size = 1 }
Canvas.TextOut(10, 10, 'Copying ' + IntToStr(FileSize(FromF))
+ ' bytes...');
repeat
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
BlockWrite(ToF, Buf, NumRead, NumWritten);
until (NumRead = 0) or (NumWritten <> NumRead);
CloseFile(FromF);
CloseFile(ToF);
end;
end;
end;
 
建议用流,我的文件分割器就是用他的,很快的
 
后退
顶部