Einzelnen Beitrag anzeigen

opfer.der.genauigkeit

Registriert seit: 14. Feb 2005
66 Beiträge
 
#3

Re: CreateFile + VirtualAlloc -> Datei kopieren (geht/nic

  Alt 10. Nov 2008, 21: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.
  Mit Zitat antworten Zitat