SHFileOperation



  • Hi,

    ich würde gerne in meiner Anwendung dem Benutzer ermöglichen an gewissen Dateien und Ordnerstrukturen etwas ändern, diese Änderung aber mit einem Klick auf Abbrechen rückgängig machen zu können.
    Dazu möchte ich ein Verzeichniss mit allen Dateien und Unterverzeichnissen an einen anderen Ort kopieren (oder verschieben), um ihn bei bedarf zurück in den Ursprungspfad zu holen.

    Gibt es da irgendwo 'ne passende Funktion? Oder wie wird das gemacht? Ich bin leider im Umgang mit Dateien wenig erfahren. Hab' schon ziemlich lange im Web gesucht, aber absolut nichts Passendes gefunden. Scheint nicht so einfach zu sein.

    Ich hoffe mir kann da jemand helfen, wäre echt super, bin schon 'nen bisschen verzweifelt.

    Vielen Dank schon mal,
    teichi



  • du könntest dir etwas aus hume sikkins dirstream basteln

    http://fara.cs.uni-potsdam.de/~kaufmann/dirstream/index.html



  • boost::filesystem würde sich hierfür recht gut eignen, denke ich...
    Ansonsten haben die meisten GUI-Frameworks (und wenn du etwas mit einem Klick rückgängig machen lassen willst, nehme ich an, dass du GUI-Anwendungen programmierst) selber Schnittstellen zu Pfaden und Dateien. Die zu nutzen ist möglicherweise die naheliegendste Lösung.



  • Vielen Dank schon mal für die Antworten, ich schau's mir gleich mal an.

    Übrigens:
    Ja, das ist 'ne GUI Anwendung. MFC unter Visual C++. Aber ich habe da keine Schnittstellen zu dem Thema gefunden, wäre natürlich das einfachste. Gibt es da sowas?



  • SHFileOperation (WinAPI)



  • Danke für die prompte Antwort, wie ist das denn zu benutzen?
    Bin leider echt kein Profi.
    WINAPI hab'ich noch nie gemacht.
    Es wär schon toll, wenn ich alle Dateien in einem Verzeichniss kopieren könnte.



  • google?



  • Ok, Super!
    Ich kann jetzt ganze Verzeichnisse mit allem drin(Dateien + Unterverzeichnisse) in andere Verzeichnisse kopieren.

    _SHFILEOPSTRUCTA test;

    test.hwnd = NULL;
    test.wFunc = FO_COPY;
    test.pFrom = "F:\\ver1\0";
    test.pTo = "F:\\ver2\0";
    test.fFlags = NULL;

    SHFileOperation(&test);

    Kann mir noch jemand 'nen Tipp geben wie ich nur den Inhalt von "ver1" nach "ver2" kopieren könnte? Sowas wie test.pFrom = "F:\\ver1\.\0"; klappt leider nicht. Ich hab's schon mal mit dem FOF_FILESONLY Flag versucht hat aber auch nicht hingehauen.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • teichi schrieb:

    Sowas wie test.pFrom = "F:\\ver1\.\0"; klappt leider nicht. Ich hab's schon mal mit dem FOF_FILESONLY Flag versucht hat aber auch nicht hingehauen.

    Hast du die Kombination aus beidem auch schon getestet?!



  • Vielen Dank, für Eure Hilfe, komme jetzt schon einigermaßen zurecht.
    Ein bisschen Schwierigkeiten habe ich allerdings noch:

    Also, ich würde gerne den Pfadnamen, den ich kopieren möchte, aus einzelnen Strings zusammenfügen (z.B. als CString) und ihn dann bei pFrom angeben.
    Das Programm wird auch ohne Probleme kompiliert, jedoch bekomme ich beim ausführen die Fehlermeldung, dass Quelldatei oder Quelldatenträger nicht gelesen werden können.

    Da pFrom ja vom Typ LPCTSTR ist, habe ich versucht nach dem Zusammenfügen der einzelnen Strings, diese in LPCTSTR bzw. const char* umzuwandeln, das führt aber zum gleichen Fehler.
    Nur wenn ich vorher eine Variable vom Typ const char* erzeuge und ihr direkt einen kompletten Pfadnamen zuweise, funktioniert das kopieren, wenn ich diese Variable pFrom zuweise. (Im Codeausschnitt From5)

    CString From = "F:\\"+"ver1"+"\0";  
       int nLen = From.GetLength();  
       LPCTSTR From2 = From.GetBuffer(nLen);
       const char* From3 = From.GetBuffer(nLen);
       const char* From4= (LPCTSTR) From;
       const char* From5= "F:\\ver1\0";
    
        _SHFILEOPSTRUCTA test;
    
        test.hwnd   = NULL;
        test.wFunc  = FO_COPY;
        test.pFrom  = From5;  //bei allen anderen "Froms" wird zwar kompiliert,                                
                              //aber kopieren geht schief
        test.pTo    = "F:\\ver2\0";
        test.fFlags = NULL;
    
        SHFileOperation(&test);
    
        From.ReleaseBuffer();
    

    Gibt's da irgend'ne Möglichkeit erst zur Laufzeit über die Zusammensetzung des Pfades zu entscheiden?

    Noch ein Problem:
    Ich würde gerne nicht den kompletten Pfad angeben müssen, sondern aus dem aktuellen Verzeichniss heraus navigieren. Also z.B.: mit "../" eine Verzeichniss-Hierarchy (hoffentlich richtig geschrieben) tiefer gehen. Da ich noch nicht weiss in welchem Verzeichniss und auf was für einem Laufwerk mein Programm liegen wird. Bei den normalen fstream.h-Methoden ist das ja beispielsweise möglich, mit SHFileOperation auch?

    Danke, für die Mühe.
    teichi


Anmelden zum Antworten