1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| type
TBuffer = Array[0..2047] of Byte;
var
Buffer : TBuffer; // buffer utilisé pour la copie
SrcHandle, DestHandle : THandle; // handle
Overlapped : POverlapped;
Pos : integer; // position du curseur sur le fichier source en coursde lecture
ReadSuccess : boolean; // indique si la lecture s'est bien déroulée
ReadCount : integer;
SrcHandle := CreateFile('E:\missions.dat', GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED or FILE_FLAG_NO_BUFFERING, 0); // ouvre le fichier source
DestHandle := CreateFile('C:\temp\test.test', fmCreate or fmOpenWrite); // crée le fichier cible
Pos := 0;
FileSeek(SrcHandle, Pos, 0); // Se positionne au début du fichier source
New(Overlapped); // Création de la structure Overlapped
Overlapped.Offset :=0;
Overlapped.OffsetHigh := 0;
Overlapped.hEvent := 0;
ReadSuccess := ReadFile(SrcHandle, Buffer, 2048, ReadCount, Overlapped); // lecture
if not ReadSuccess then Begin // la lecture ne se déroule jamais correctement au 1er coup. on cherche la raison
case GetLastError of
ERROR_HANDLE_EOF : // fin du fichier
begin
// placer code de fin
end;
ERROR_IO_PENDING : // fichier en cours de lecture
begin
ReadSuccess := GetOverlappedResult(SrcHandle, Overlapped^, readCount, FALSE); // teste si la lecture s'est bien déroulée.
if ReadSuccess then Begin
FileWrite(DestHandle, Buffer, 2048); // écriture du buffer dans le fichier
End;
End;
End;
End; |
Partager