Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datei kopieren



Kirsche
09-10-2005, 11:41
Hallo Leute,

weiß jemand, wie man Dateien von einem in den anderen Ordner kopiert? Ich habe weder in "QFile", noch in "QFileDialog", noch in "QDir" was gefunden.

Vielen Dank,

anda_skoa
09-10-2005, 15:57
Nicht blockierend: QUrlOperator::copy
Davor qInitNetworkProtocols() nicht vergessen.

Blockierend: zwei QFiles, aus einem Lesen in das andere Schreiben.

Ciao,
_

Kirsche
09-10-2005, 17:48
Hallo anda_skoa,

darauf muss man erst mal kommen!

Ich habe es nun wie folgt programmiert ( Achtung: hat einen logischen Fehler)

QUrlOperator chpOperator;
qInitNetworkProtocols(); // needed for copying
QPtrList<QNetworkOperation> operationList = chpOperator.copy( chpPath, dataFilesPath , false, true );

bool success = true;

for ( QNetworkOperation* operation = operationList.first(); operation; operation = operationList.next() )
{
if( operation->errorCode() == QNetworkProtocol::NoError )
{
success = false;
}
}

if( success == false )
{
QMessageBox::warning ( this, "Import Error","Could not copy file \'" + chpPath + "\' !\nPerhaps the file already exists.", QMessageBox::Ok , QMessageBox::NoButton, QMessageBox::NoButton );
statusBar()->message( "Import Error: Could not copy file \'" + chpPath + "\' !\nPerhaps the file already exists.", 2000);
return;
}

Ich hatte aus Versehen "operation->errorCode() == QNetworkProtocol::NoError" geschrieben, was natürlich unlogisch ist. Kopiert wurde allerdings.

Dann habe ich die Zeile umgeschrieben:
"operation->errorCode() != QNetworkProtocol::NoError"

Nun kommt zwar keine Meldung mehr, aber die Datei wird nicht kopiert! Dabei ist der Vergleich hinter dem eigentlichen Kopieren. Verstehst du das? :confused:

Gibt es noch eine kurzere Variante? Bei "CopyFile" erhält man bool zurück. Da ist der ganze Befehl zum Kopieren zusammen mit dem Vergleich nur eine Zeile lang. Aber "CopyFile" läuft, glaube ich, nur unter Windows.

Schöne Grüße,

anda_skoa
09-10-2005, 18:23
QUrlOperator chpOperator;
qInitNetworkProtocols(); // needed for copying

Das reicht einmal im Programm, zum Beispiel gleich in main()



QPtrList<QNetworkOperation> operationList = chpOperator.copy( chpPath, dataFilesPath , false, true );

bool success = true;

for ( QNetworkOperation* operation = operationList.first();


Das geht so nicht.
QUrlOperator ist non-blocking, d.h. wie QSocket auf eine laufende Eventloop angewiesen.
D.h. auch, daß Operationen sofort zurückkehren und ihre Beendigung durch Signals signalisiert wird.



Nun kommt zwar keine Meldung mehr, aber die Datei wird nicht kopiert! Dabei ist der Vergleich hinter dem eigentlichen Kopieren. Verstehst du das? :confused:

Das eigentliche Kopieren startet erst, wenn die Programmausführung wieder zurück in der Eventloop ist.

Also, QUrlOperator in der Instanz der Klasse oder am Heap erzeugen, Signals connecten, starten, return.

Ciao,
_

Kirsche
10-10-2005, 09:22
Hallo anda_skoa,

das habe ich nicht verstanden. Was soll ich connecten?
Mein Hauptprogramm besteht aus einem QWorkspace. In meiner Menubar gibt es einen Unterpunkt "Import". Wenn man auf diesen klickt, ruft man einen Slot auf. Dann öffnet sich ein QFileDialog, in dem man einen Dateinamen auswählen kann. Anschließend soll die Datei in den Unterordner kopiert werden. Wo soll ich nun was machen?
Sorry, ich steh etwas auf dem Schlauch.

Schöne Grüße,

anda_skoa
10-10-2005, 11:00
QUrlOperator ist ein QObject mit Signals, die dir über den Verlauf der Operation(en) Auskunft geben.

Die Methoden blockieren nicht, d.h. die Arbeit passiert im Hintergrund und ihre Beendingung erfährt man über die Signals

Ciao,
_

Kirsche
03-01-2006, 13:35
Hallo anda_skoa,

ich habe das Kopieren nun endlich hinbekommen. Kann man das Ganze auch mit Blockieren realisieren? Ich bin manchmal darauf angewiesen, zu unterscheiden, ob kopiert wurde oder nicht, weil dementsprechend andere Aktionen folgen sollen.

Kann ein slot einen Rückgabewert haben? Wie komme ich dann an diesen heran?

Eine kleine Zeitverzögerung wäre auch schon gut. Obwohl das Signal finished empfangen wurde, ist die Datei noch nicht wirklich da. Ich rufe die Aktion in dem Fall erst in dem Slot auf, der das Signal empfangen hat. Zeige ich eine Messagebox an, reicht die Zeitverzögerung. Irgendetwas stimmt da nicht.

Schöne Grüße,

anda_skoa
09-01-2006, 17:18
Blockierend könntest du einfach aus der einen Datei lesen und in die andere Schreiben.

Alternativ kannst du das auch analog nicht-blockierend mit einem zusätzlichen Thread machen.

Ciao,
_

Kirsche
20-01-2006, 18:37
Hallo anda_skoa,

wenn ich eine Datei auslese und dann an die andere Stelle schreibe, ist das genauso schnell wie der Weg über QUrlOperator?

Was meinst du mit "anderer Thread"?

Schöne Grüße,

anda_skoa
21-01-2006, 13:06
Vermutlich schneller, weil QUrlOperator das im Wesentlichen auch so macht, aber zwischendurch in die Eventloop zurückkehrt um nicht zu blockieren.

Mit dem zusätzlichen Thread meinte ich, daß man das blockierende Kopieren, also die Schleife die blockweise Daten aus der Quelldatei liest und in die Zieldatei schreibt, über einen QThread implementieren kann.

Ciao,
_

Kirsche
21-01-2006, 20:20
Hallo anda_skoa,

danke für die Tipps. Momentan mache ich das Ganze mit CopyFile, aber das geht nur unter Windows. Sobald ich unter Linux arbeiten muss, mache ich es dann mit dem Auslesen und direktem Schreiben. Das hört sich gut an. Bei diesem Weg kann ich auch testen, ob es geklappt hat oder nicht und entsprechend darauf reagieren.

Schöne Grüße,