Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Dateien / Laufwerke (https://www.delphipraxis.net/41-library-dateien-laufwerke/)
-   -   Delphi Dateioperationen mit SHFileOperation (https://www.delphipraxis.net/1260-dateioperationen-mit-shfileoperation.html)

sakura 7. Nov 2002 12:53


Dateioperationen mit SHFileOperation
 
Hi DPler,

diesen Beitrag habe ich zum ersten Mal am 1.11.2000 bei Delphi3000.com veröffentlicht. Nach und nach werde ich verschiedene meiner Beiträge hier einbringen.

Die Prozedure DoFileWork, welche ich hier vorstelle, ermöglicht es Dateioperationen (kopieren, löschen, verschieben, ...) mit Hilfe der WinAPI Funktion SHFileOperation durchzuführen.

Der Syntax
Delphi-Quellcode:
function DoFileWork( 
  aWnd: HWND; aOperation: UINT; aFrom, aTo: TStrings; aFlags: FILEOP_FLAGS
): Integer;
Ein Beispiel
Delphi-Quellcode:
DoFileWork(Self.Handle, FO_DELETE, strlFiles, nil, FOF_ALLOWUNDO);
Dieser Aufruf verschiebt alle Dateien und Verzeichnisse, welche in der StringListe strlFiles stehen in den Windows-Papierkorb.

Parameter:
  • aWnd - Handle zum aufrufenden Fenster
  • aOperation - eine der folgenden Konstanten
    • FO_MOVE
    • FO_COPY
    • FO_DELETE
    • FO_RENAME (Wildcards können nicht genutzt werden!)
  • aFrom - Namen der Quellen (vollständige Pfadangaben !)
  • aTo - Namen der Ziele wenn nötig (nil für FO_DELETE)
  • aFlags - mögliche Flags zur Verarbeitung
    • FOF_ALLOWUNDO - Ermöglicht eine Umkehrung der letzten Operation
    • FOF_FILESONLY - Verzeichnisse ignorieren
    • FOF_MULTIDESTFILES - aTo hat einen Eintrag für jeden Eintrag in der aFrom Liste
    • FOF_NOCONFIRMATION - Der User muss keine Bestätigung zum Überschreiben, etc. geben
    • FOF_NOERRORUI - Fehlermeldugen unterdrücken
    • FOF_NORECURSION - Unterverzeichnisse ignorieren
    • FOF_RENAMEONCOLLISION - Datei umbenennen, wenn diese bereits im Zielverzeichnis existiert (Kopie 1 von ...)
    • FOF_SILENT - Fortschrittsanzeige unterdrücken.
Es existerien weitere Flags, welche in der Online Hilfe stehen.

Ergebnisse der Funktion:
  • 0 - erfolgreich
  • <> 0 - Windows Fehlercode


Hinweis: Die Unit ShellAPI muss in der Uses Klausel stehen!

Delphi-Quellcode:
function DoFileWork(
  aWnd: HWND; aOperation: UINT; aFrom, aTo: TStrings; aFlags: FILEOP_FLAGS
  ): Integer;
var
  I: Integer;
  FromPath, ToPath: string;
  SHFileOpStruct: TSHFileOpStruct;
begin
  FromPath := '';
  for I := 0 to aFrom.Count - 1 do
    FromPath := FromPath + aFrom.Strings[I] + #0;
  FromPath := FromPath + #0;

  if Assigned(aTo) then
  begin
    ToPath := '';
    for I := 0 to aTo.Count - 1 do
      ToPath := ToPath + aTo.Strings[I] + #0;
    ToPath := ToPath + #0;
    if aTo.Count > 0 then
      aFlags := aFlags or FOF_MULTIDESTFILES;
  end;

  with SHFileOpStruct do
  begin
    Wnd := aWnd;
    wFunc := aOperation;
    pFrom := PChar(FromPath);
    if Assigned(aTo) then
    begin
      pTo := PChar(ToPath)
    end else begin // target available
      pTo := nil;
    end; // target not available
    fFlags := aFlags;
  end; // structure
  Result := SHFileOperation(SHFileOpStruct);
end;
...:cat:...

sakura 9. Sep 2003 13:10

Re: Dateioperationen mit SHFileOperation
 
Da obige Methode oft für Verwirrung sorgt, hier eine weitere Funktion, welche nicht auf StringListen, sondern auf einfachen Strings basiert. QuellDateiname (oder Verzeichnis ohne abschließenden Backslash) auf aFrom übergeben. Wenn nicht gelöscht wird, dann das Ziel an aTo übergeben, Operation (z.B. FO_MOVE) an aOperation übergeben und ab!

Delphi-Quellcode:
function DoFileWork(aOperation: FILEOP_FLAGS; aFrom, aTo: AnsiString;
    Flags: FILEOP_FLAGS): Integer;
var
  FromPath, ToPath: AnsiString;
  SHFileOpStruct: TSHFileOpStruct;
begin
  FromPath := aFrom + #0#0;
  ToPath := aTo + #0#0;
  with SHFileOpStruct do
  begin
    Wnd := 0;
    wFunc := aOperation;
    pFrom := PAnsiChar(FromPath);
    if ToPath <> '' then
    begin
      pTo := PAnsiChar(ToPath)
    end else begin // target available
      pTo := nil;
    end; // target not available
    fFlags := Flags;
  end; // structure
  Result := SHFileOperationA(SHFileOpStruct);
end;
...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz