Registriert seit: 14. Feb 2005
66 Beiträge
|
Re: CreateFile + VirtualAlloc -> Datei kopieren (geht/nic
10. Nov 2008, 22:06
Zitat von nicodex:
The Datei-Handles werden nur freigegeben wenn VirtualAlloc erfolgreich war. Und da beim Ziel kein FILE_SHARE_READ angeben wurde, kann man erst darauf zugreifen wenn die Anwendung beendet wurde.
Danke...
Zitat von nicodex:
BTW: try-finally wäre auch nützlich.
Weil? Es ist doch keine Funktion dabei, die eine Exception erzeugen kann.
Zitat von nicodex:
Edit: VirtualAlloc( nil, Size, ...) sollte wahrscheinlich VirtualAlloc( nil, 2048, ...) lauten. Wobei man sich das ganze sparen kann, falls die Datei 0 Byte groß ist.
Danke...
Codeupdate:
Delphi-Quellcode:
var
LoSize ,
UpSize : Cardinal;
Size : Int64;
Read ,
Written : Cardinal;
IO : Pointer;
hSrcFile ,
hDestFile: THandle;
Ok : Boolean;
begin
Result := False;
hSrcFile := CreateFile( PAnsiChar(aSrcFile), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0 );
if ( hSrcFile = INVALID_HANDLE_VALUE ) then
begin
DoNotifyError( SysErrorMessage( GetLastError ) );
Exit;
end;
hDestFile := CreateFile( PAnsiChar(aDestFile), GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, 0 );
if ( hDestFile = INVALID_HANDLE_VALUE ) then
begin
CloseHandle( hSrcFile );
DoNotifyError( SysErrorMessage( GetLastError ) );
Exit;
end;
LoSize := GetFileSize( hSrcFile, @UpSize );
Size := ( UpSize shl 16 or LoSize );
if ( Size > 0 ) then
begin
IO := VirtualAlloc( nil, 2048, MEM_COMMIT, PAGE_READWRITE );
if ( ( Assigned( IO ) ) ) then
begin
Ok := True;
Read := 0;
Written := 0;
while ( Ok and ( Read = Written ) and ( Size > 0 ) ) do
begin
Ok := ReadFile( hSrcFile, IO^, 2048, Read, nil );
if ( Ok and ( Read > 0 ) ) then
begin
Ok := WriteFile( hDestFile, IO^, Read, Written, nil );
Size := Size - Written;
end;
end;
if ( not Ok ) then DoNotifyError( SysErrorMessage( GetLastError ) );
VirtualFree( IO, 0, MEM_RELEASE );
Result := Ok;
end else
begin
DoNotifyError( SysErrorMessage( GetLastError ) );
end;
CloseHandle( hSrcFile );
CloseHandle( hDestFile );
Stellen Sie sich bitte Zirkusmusik vor.
|
|
Zitat
|