kopieren von Dateien und Verzeichnisse mit SHFILEOPSTRUCT



  • Hallo,
    habe folgenden Code aus dem Forum (Happy Builder) in mein Projekt eingebunden.

    #include <ShellApi.hpp> 
    
    void __fastcall ExecuteOp(AnsiString From , AnsiString  Dest, int IdOp) 
    { 
      TSHFileOpStruct *ShFile = new TSHFileOpStruct(); 
    
      From = ExpandFileName(From); 
      Dest = ExpandFileName(Dest); 
    
      char zFrom[MAX_PATH]; 
      char zDest[MAX_PATH]; 
    
      for(int i=0; i<MAX_PATH; ++i ) 
      { 
        zFrom[i] = '\0'; 
        zDest[i] = '\0'; 
      } 
    
      strcpy(zFrom, From.c_str()); 
      strcpy(zDest, Dest.c_str()); 
    
      ShFile->hwnd   = GetActiveWindow(); 
      ShFile->wFunc = IdOp; 
      ShFile->pFrom = zFrom; 
      ShFile->pTo   = zDest; 
    
      if (IdOp != FO_DELETE) 
        ShFile->fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR; 
      else 
        ShFile->fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION; 
    
     bool result = SHFileOperation(ShFile); 
     ShFile->fAnyOperationsAborted; 
     delete ShFile; 
    } 
    
    void __fastcall CopyFiles( const AnsiString From, const AnsiString Dest) 
    { 
      ExecuteOp(From,Dest, FO_COPY); 
    } 
    
    void __fastcall DeleteFiles( const AnsiString Files ) 
    { 
      ExecuteOp(Files,"", FO_DELETE); 
    } 
    
    void __fastcall MoveFiles( const AnsiString From, const AnsiString Dest) 
    { 
      ExecuteOp(From,Dest, FO_RENAME); 
    }
    

    Funktionier einwandfrei. Welche Parameter muß ich zum kopieren übergeben, das
    a) alle kopiert werden
    b) nur die ältere ?
    gruß Siegfried 🙂

    [ 27.08.2006: Beitrag editiert von: Beppo ]
    Möchte noch zusätzlich ein Frage stellen. Wenn ich die > QUELLE < direkt auf z.B. > C:\ < einstelle, bekomme ich eine Fehlermeldung. Muß ich hier zuerst in ein paar Zeilen die Verzeichnisse ermitteln, oder giebt es eine andere Möglichkeit ?
    Gruß Siegfried 🙂



  • Um alle Dateien zu kopieren muss der Aufruf wie folgt aussehen:

    CopyFiles("C:\\test\\*.*", "C:\\")
    

    C:\ ist falsch, richtig ist: C:\\
    Siehe auch hier: http://www.bytesandmore.de/rad/cpp/snipp/sc01005.php

    Einen einfachen Weg ältere Dateien zu löschen gibt es so gesehen nicht, allerdings haben sich darüber auch schon andere Leute gedanken gemacht:
    http://www.bytesandmore.de/rad/cpp/snipp/sc01002.php

    hf



  • Hallo,
    Wenn ich die > QUELLE < direkt auf z.B. > C:\. < einstelle, ist das Problem mit einer Partition gelöst.
    Das andere muß ich überarbeiten.
    Gruß Siegfried 🙂



  • Hallo,
    Inzwischen habe ich folgendes herausbekommen. Wenn ich in das Zielverzeichnis, vorausgesetzt dies existeiert nicht (z.B. D:\Ordner1) kopieren möchte, muß ich vor der Kopier-Routiene diesen erstellen. Sollte das Ziel aus mehreren Verzeichnise bestehen (D:\Ordner1\Ordner2\Ordner3), muß ich diese all einzeln in einer Schleife anlegen. Gibt es eine andere Möglichkeit ?

    Gruß Siegfried 🙂



  • Hallo,

    Du könntest mit ForceDirectories() den kompletten Pfad vorher erstellen.



  • Hallo,
    wieder etwas gelernt!
    Danke für die schnelle Info
    Gruß Siegfried 👍 👍 👍


Anmelden zum Antworten