Ordner kopieren



  • hey leute,
    ich würde gerne ein programm schreiben, dass einen Ordner kopiert und in einem anderen Ordner mit _x abspeichert.
    Pfad is z.b.: C:\Dokumente und Einstellungen\USER\Desktop\Dokumente
    Zielpfad ist z.b.: D:\Dokumente_x

    mir kommt es jetzt im moment noch nicht darum dass der Pfad genau passt (mein damit, der pfad kann sich noch ändern), sondern nur, wie kopier ich ein Ordern wo anderst hin.

    gruß



  • Mit standard c++ wird das schwierig (außer wenn der neue standard da was hat was ich nicht glaube). Du brauchst dafür eine bibliothek wie qt oder boost, oder du musst direkt auf die api deines betriebssystems zugreifen.



  • FlorianB schrieb:

    wie kopier ich ein Ordern wo anderst hin.

    Der Fragestellung nach zu urteilen, gehe ich mal davon aus, dass du dir die mit wichtig gekennzeichneten Threads im Forum noch nicht gelesen hast. Ferner gehe ich davon aus, dass du noch nicht versucht hast, auf Linux umzusteigen, d.h. du dürftest Windows-User sein.

    Antwort auf deine Frage:

    1. Öffne den Windows Explorer
    2. Navigiere in den Ordner C:\Dokumente und Einstellungen\USER\Desktop
    3. Rechtsklick auf den Ordner Dokumente
    4. Im Kontextmenü den Eintrag "kopieren" auswählen
    5. Navigiere nach D:\
    6. Rechtsklick in den freien Bereich
    7. Im kontextmenü Eintrag "Einfügen" wählen
    8. Ordner Dokumente auswählen (nicht öffnen) und F2 drücken.
    9. _x an den Ordnernamen anhängen, dann Enter.

    Fertig.

    Nicht die gewünschte Antwort? Dann schau dir deine Frage nochmal an, da könnte es dran liegen. 🙄



  • Also ich füge noch hinzu:
    ich bin windows xp user
    würde es gern wenn möglich mit c++ machen in visual studio 2008 machen
    es kann auch eine grafische Oberfläche haben, z.b. in Richtung GetOpenFile
    ich hoffe jetzt hab ich es genauer beschreiben.

    Gruß



  • Wenn es dir recht ist, mit WINAPI (zweiter Eintrag bei Google)

    Und an deinem Deutsch (bzw. deiner Grammatik) musst du auch noch arbeiten...





  • Ich persönlich würde dir empfehlen die boost-bibliothek zu benuzten. Das hat den Vorteil, dass du dei Programm unter verschiedenen Betriebssystemen kompilieren kannst ohne es gleich komplett neu zu schreiben.

    http://www.boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/index.htm


  • Administrator

    MrKnister schrieb:

    Ich persönlich würde dir empfehlen die boost-bibliothek zu benuzten. Das hat den Vorteil, dass du dei Programm unter verschiedenen Betriebssystemen kompilieren kannst ohne es gleich komplett neu zu schreiben.

    http://www.boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/index.htm

    Viel wichtig ist, dass Boost die Arbeit deutlich vereinfacht. Siehe:
    http://www.boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/reference.html#copy_directory

    Und vergleiche mit SHFileOperation 😉

    Die Frage darf aber auch in den Raum gesetzt werden, ob FlorianB in der Lage ist, Boost einzurichten und zu verwenden. Daher ist am Ende für ihn vielleicht SHFileOperation doch einfacher.

    Grüssli



  • Hey Leute,
    so mit dem Ordner kopieren bin ich größtenteils klar gekommen.
    Wie kann ich nun die einzelnen Dateien in dem Ordner in ein Array speichern, um sie dann weiter zu bearbeiten?
    Gruß



  • WinAPI-Weg: FindFirstFile/FindNextFile und in einer do-while-Schleife die Pfade der gefundenen Ordner und Dateien geschickterweise einem std::vectorstd::string hinzufügen (Details in der WinAPI-FAQ).

    Oder eben boost (hier ist ein kurzes Beispiel).



  • Hey leute,

    ma noch ne kurze Frage zu SHFileOperation:

    Ich hab jetzt folgenden Code:

    .
    .
    .
    	LPTSTR inputPath; //wir durch eine Textfeld mit nem Pfad gefüllt
    	LPTSTR copyPath; //ebenso durch ein Textfeld
    
    	SHFILEOPSTRUCT sf;
    	memset(&sf,0,sizeof(sf));
    	sf.hwnd = 0;
    	sf.wFunc = FO_COPY;
    	sf.pFrom = inputPath;	//Pfad von Dateiordner
    	sf.pTo = copyPath;		//Pfad der Kopie
    	sf.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_SIMPLEPROGRESS;
    .
    .
    .
    

    So nun zu meiner Frage:
    so wie es jetzt im moment ist, funktioniert das Kopieren noch nicht. Den Fehler hab ich nach langem suchen selber rausgefunden.
    Der Pfad der in inputPath bzw in copyPath geschrieben wird, sieht so aus:
    inputPath: D:\USER\Test
    copyPath: D:\Test

    die SHFileOperation Funktion brauch zum kopieren aber einen Pfad mit doppelten \ Zeichen.
    Gibt es dazu ne Funktion die das automatisch macht, also aus
    D:\USER\Test soll
    D:\\USER\\Test werden.

    Oda kann ich die SHFileOperation anderst einstellen, dass es auch mit einfachem \ Zeichen funktioniert?

    gruß



  • \\ ist eine Escape-Sequenz. Denn das \ Zeichen wird für andere Sachen gebraucht.
    Nimm lieber /.



  • Also den Pfad nehm ich mithilfe eines OpenFileDialog auf.
    Wie meinst du das mit / ?
    Wenn ich einen Pfad angebe, der / statt \\ enthält, funktioniert das Kopieren nicht. Oder hast du das jetzt anderst gemeint?
    Im Prinzip such ich nur ne Möglichkeit, wie ich aus den \ automatisch \\ machen kann.
    Gruß



  • Die meisten Libs unterstützen heutzutage auch / unter Windows. Das ist dann etwas einfacher zu handhaben, besonders wenn man das Programm noch unter z.B. Linux verwendet wo sowieso / zum Einsatz kommt.
    Da die Funktion anscheinen auf \\ besteht, hier eine Funktion um aus \ ein \\ zu machen:

    std::string doubleBackslash(std::string input)
    {
        std::string output;
        for (int i=0;i < input.size();++i)
        {
            output += input[i];
            if (input[i] == '\\') output += '\\';
        }
        return output;
    }
    


  • Hey Leute,
    gutes neues erst mal noch 🙂

    Danke mal an Osbios! Der Code funzt super. Nur hab ich es jetzt mal in mein Programm eingebaut und das liefert mir den Pfad in einem LPTSTR. Wie wandel ich diesen in einen normal string um, um ihn zu bearbeiten?

    Hab schon google durchforstet aber nichts passendes gefunden 😞

    MfG



  • FlorianB schrieb:

    Hab schon google durchforstet aber nichts passendes gefunden 😞

    Bezweifle ich mal ganz arg. Zwei Schritte:

    1. google mal nach LPSTR und finde gleich im allerersten Link, was ein LPSTR tatsächlich ist.
    2. überlege, wie man sowas wohl in einen std::string konvertieren kann (zur Not C++-Referenz bemühen, sollte aber jeder nach den ersten Kapiteln im Anfängerbuch verinnerlicht haben)


  • pumuckl schrieb:

    überlege, wie man sowas wohl in einen std::string konvertieren kann (zur Not C++-Referenz bemühen, sollte aber jeder nach den ersten Kapiteln im Anfängerbuch verinnerlicht haben)

    LPSTR str(const_cast<char*>("ooooo"));
            std::string meinstring(str);
    

    @pumuckl: Ich bezweifle stark, dass du seinen Post richtig gelesen hast.

    pumuckl schrieb:

    1. google mal nach LPSTR und finde gleich im allerersten Link, was ein LPSTR tatsächlich ist.

    FlorianB schrieb:

    Nur hab ich es jetzt mal in mein Programm eingebaut und das liefert mir den Pfad in einem LPTSTR.

    Ist (bzw. sollte) aber sowieso das Gleiche sein, also diesmal nich' so schlimm 🕶



  • Hey,

    vielen dank an Hacker.

    Wenn ich es in einem leeren Projekt teste funktioniert alles.

    Wenn ich es in mein richtiges Programm einbaue, kriege ich folgende Fehlermeldung:

    error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::allocator<_Ty> &)': Konvertierung des Parameters 1 von 'LPTSTR' in 'const std::allocator<_Ty> &' nicht möglich

    An was kann das liegen?
    MFG



  • typedef std::basic_string<TCHAR> tstring;
    

    Und ab dann tstring statt string/wstring nutzen.



  • Ist für dein Projekt Unicode aktiviert?
    Übrigens verlangt SHFileOperation für die beiden Member pFrom und pTo der Struktur SHFILEOPSTRUCT , dass sie doppelt nullterminiert sind. Ich weiß nicht, ob string::c_str das erfüllt, auch wenn man ein zusätzliches '0' anhängt.



  • DocShoe schrieb:

    Ist für dein Projekt Unicode aktiviert?
    Übrigens verlangt SHFileOperation für die beiden Member pFrom und pTo der Struktur SHFILEOPSTRUCT , dass sie doppelt nullterminiert sind. Ich weiß nicht, ob string::c_str das erfüllt, auch wenn man ein zusätzliches '0' anhängt.

    Klar, ein std::string kann billig viele Nullen im Content haben und c_str hängt noch eine weitere an.


Anmelden zum Antworten