Kopieren mit Hilfe der QStringList



  • Hallo Leute,

    ich möchte aus einem Ordner alle Dateien kopieren und die Dateinamen beibehalten. Die Dateien sollen dann in einen neuen Ordner kopiert werden.

    void Functions::copyFolder(QStringList& folder2copy) {
    	QString tmp("C:/Evaluation/Logs/");
    	for(QStringList::Iterator it = folder2copy.begin(); it != folder2copy.end(); ++it) {
    		QString res = tmp.append(*it);
    		CopyFileA(*it,res),false);
        }
    }
    

    Ich hole mir aus einem QDir mit entryList() alle Dateinamen und speicher die in einer QStringList.
    Dann wird die Funktion copyFolder aufgerufen. Da man in einer QStringList mit einem Iterator über alle Elemente laufen kann, dachte ich mir, dass ich mir einen QString zusammenbastel der dann den Pfad und den Dateinamen der CopyFileA-Funktion übergibt. Wenn der erste Eintrag in der Liste bla.7z ist, dann wird eben C:/Evaluation/Logs/bla.7z als zweites Argument übergeben.

    Allerdings wird in meiner Funktion gar nicht kopiert. Ich habe eine ähnliche Methode mit einem QString geschrieben, die funktioniert einwandfrei. Der Unterschied ist nur, dass ich keinen konkreten QString habe, sondern mir den erstmal zusammen basteln muss. Hier wird außerdem jedes Mal der nächste Dateiname an res angehängt, was natürlich auch nicht sein soll. Ich dachte mir erst, dass ich res mit res.truncate(0); am Ende der Schleife auf sozusagen "" (nichts) setzen kann, um den QString dann wieder neu füllen zu können. Das funktioniert allerdings auch nicht.

    Hat jemand eine Idee und kann mir weiterhelfen? Warum wird bei mir nicht kopiert und wie regel ich am besten die Namensvergabe?

    Gruß tester



  • Es wird nicht immer an res angehangen, tmp.append() verändert tmp, weshalb ab dem zweiten Schleifendurchlauf Mist in tmp steht.
    Du willst eher

    QString res = tmp + *it;
    

    Wenn das Kopieren dann trotzdem noch fehlschlägt, kann dir niemand sagen ohne CopyFileA zu kennen. Denn "eine ähnliche Funktion" ist eben nicht genau die gleiche.



  • Vielen Dank!

    Genau das wollte ich. Ist auch logisch, da mit append() ja immer hinten angehängt wird.

    Das Kopieren aller Dateien in diesem Ordner funktioniert allerdings immer noch nicht. Die "ähnliche Funktion" war nicht auf CopyFileA bezogen, da diese eine Funktion der Windowsbibliothek ist ( http://msdn.microsoft.com/en-us/library/aa363851(VS.85).aspx ).

    void Functions::copyLogs(QString& file2copy) {
    	if(!dir.exists()) {
    		dir.mkdir("C:/Evaluation/");
    		dir.mkdir("C:/Evaluation/Logs/");
    		dir.mkdir("C:/Evaluation/Settings/");
    	}
    	CopyFileA(file2copy,"C:/Evaluation/Logs/test.7z",false);
    }
    

    Der Unterschied ist, dass ich hier nur eine Datei kopiere und einen festen Namen vorgeben, wie diese Datei im Zielverzeichnis heißen soll. Das funktioniert. Es funktioniert aber wiederrum nicht, wenn ich mit den einzelnen Werten aus der QStringList als zweites Argument kopieren möchte.
    Kann es daran liegen, dass in der copyLogs-Funktion eine Zeichenkette bzw. ein String übergeben wird, während in der copyFolder-Funktion immer QStrings übergeben werden und diese nicht richtig aufgelöst werden?

    Gruß



  • tester12 schrieb:

    Kann es daran liegen, dass in der copyLogs-Funktion eine Zeichenkette bzw. ein String übergeben wird, während in der copyFolder-Funktion immer QStrings übergeben werden und diese nicht richtig aufgelöst werden?

    Es gibt viele Möglichkeiten, und solange du uns nicht sagst, wie du die Dateinamen in die QStringList bekommst, kann man auch nix sagen.
    Auch wenn du annimmst, dass Ausführungsverzeichnis == Application-Verzeichnis, kann das Probleme verursachen.

    BTW: Verwende doch QFile::copy, dann bindest du dich nicht an die WinAPI, und du bekommst keine Probleme, wenn mal QT_NO_CAST_TO_ASCII gesetzt ist.


Anmelden zum Antworten