Ordner kopieren


  • 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.



  • Ethon schrieb:

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

    Ist das tatsächlich so? Hast du vielleicht den Passus aus dem Standard zur Hand?
    Klar kann ich beliebig viele 0 anhängen, aber ist denn garantiert, dass c_str() einen Zeiger auf den kompletten Inhalt des Strings zurückgibt oder nur bis zur ersten 0?



  • Naja, zb Cpp-Reference sagt:

    Returns a pointer to a null-terminated character array with data equivalent to those stored in the string. The pointer is such that the range [c_str(); c_str() + size()] is valid and the values in it correspond to the values stored in the string with an additional null character after the last position.



  • Jau, reicht, bin zufrieden 👍


Anmelden zum Antworten