Я подал заявку на копирование файла, используя поток и метод 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;
Где моя проблема?