滚动你自己似乎是唯一的解决方案,因为CopyFileEx将始终分配文件的所有空间,即使它没有完成复制。
我在下面使用了一个简单的createfile,readfile和writefile例程。为了确保最大速度不中断,例程应该在自己的线程中运行。
procedure AltFileCopy(const source, dest : String);
var
sHandle, dHandle : THandle;
pBuffer : array[1..500000] of Byte;
dwBytesToRead : DWORD;
dwBytesRead : DWORD;
dwBytesWritten : DWORD;
Success : BOOL;
lpcontext : pointer;
begin
try
sHandle := CreateFile(PChar(source),GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
dHandle := CreateFile(PChar(dest), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0);
if (sHandle <> INVALID_HANDLE_VALUE) and (dHandle <> INVALID_HANDLE_VALUE) then begin
dwBytesToRead := sizeof(pBuffer);
Repeat
begin
ReadFile(sHandle, pBuffer, dwBytesToRead, &dwBytesRead, nil);
WriteFile(dHandle, pBuffer, dwBytesRead, &dwBytesWritten, nil);
end;
Until (dwBytesRead <> dwBytesToRead);
end;
finally
CloseHandle(dHandle);
CloseHandle(sHandle);
end;
end;
正如我的想法 - 不幸的是滚动我自己的东西,我已经尝试过,但它没有使用CopyFileEx快。 – froudeg
你可以发布你的代码吗?尝试使用缓冲区大小播放。尝试8KB,64KB和1MB。 – usr
也copyfileex复制文件属性,时间戳和NTFS备用数据流等 - 我仍然需要的东西。 我试着用缓冲区大小的playin,但即使我得到它非常快,但不足以最大限度地发挥我的吉比特局域网 - 哪个copyfileex可以做。不幸的是,速度必须和操作系统一样快......因为应用程序的主要目的是高速同步/复制。 – froudeg