【发布时间】:2011-07-15 03:24:28
【问题描述】:
我做了一个应用程序,使用线程和TFileStream的方法复制文件,但是我对速度有点失望,尤其是在复制大文件时。然后我听说了文件映射,这显然可以产生一种复制速度更快的方法,因为访问文件会更快。
我是初学者,所以我正在尝试,但我没有设法通过文件映射复制文件。 (该文件是创建 test2.iso 但不是做 0ko 3GB ^ ^。)
这是我的代码。
procedure TForm1.Button1Click(Sender: TObject);
var
FFilehandle: THANDLE;
FFileMap: THANDLE;
FmappingPtr: pchar;
hFile2: THANDLE ;
SizeFile1,BytesWritten: DWORD ;
begin
FFilehandle := CreateFile('titan.iso',
GENERIC_WRITE OR GENERIC_READ,
FILE_SHARE_READ OR FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if (FFilehandle <> INVALID_HANDLE_VALUE) then
begin
FFileMap := CreateFileMapping(FFileHandle, // handle to file to map
nil, // optional security attributes
PAGE_READWRITE, // protection for mapping object
0, // high-order 32 bits of object size
2*1024, // low-order 32 bits of object size
0); //
if (FFileMap <> NULL) then
begin
FMappingPtr := MapViewOfFile(FFileMap,
FILE_MAP_WRITE,
0,
0,
0);
if Assigned(FMappingPtr) then
begin
// Manipulation de FMappingPtr
hFile2 := CreateFile('test.iso', GENERIC_WRITE, 0, nil,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile2 <> INVALID_HANDLE_VALUE) then
begin
SizeFile1 := GetFileSize(FFilehandle, NIL); // recupere taille du fichier 1
WriteFile(hFile2, Fmappingptr, SizeFile1, &BytesWritten, NIL); // Transfert la mémoire mappé dans file 2
// libere les ressources
end
else
MessageBox(0, 'Impossible de lire le fichier mappé', 'Error', 0);
UnmapViewOfFile(Fmappingptr);
CloseHandle(FFileMap);
CloseHandle(FFilehandle);
CloseHandle(hFile2);
end
else
begin
CloseHandle (FFileMap);
CloseHandle (FFileHandle);
MessageBox(0, 'Impossible de lire le fichier mappé', 'Error', 0);
end;
end
else
begin
CloseHandle (FFilemap);
MessageBox(0, 'Impossible de mappe le fichier en mémoire', 'Error', 0);
end;
end
else
MessageBox(NULL, 'Impossible d''ouvrir le fichier', 'Error', NULL);
end;
我的问题在哪里?
【问题讨论】:
-
你有什么理由在这里重新发明轮子?为什么不直接在 WinAPI 中使用 CopyFile? msdn.microsoft.com/en-us/library/aa363851(v=vs.85).aspx
-
因为我需要像 Teracopy 或 FastCopy 那样更快地编写系统副本
-
系统文件复制将很难被击败。如果你有机会,你需要了解它的弱点是什么。你呢?
-
他们是怎么做到的?他们做了哪些系统副本没有做的事情?这就是你需要找出的,而不是反复试验。
-
你为什么不呢?因为您自称是初学者,而超越操作系统提供的系统功能并不是初学者的任务。这通常甚至不是专家的任务。
标签: delphi memory-mapped-files file-copying