Anzeige:
Ergebnis 1 bis 11 von 11

Thema: Datei kopieren

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.05.2003
    Beiträge
    226

    Datei kopieren

    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,
    Kirstin

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Nicht blockierend: QUrlOperator::copy
    Davor qInitNetworkProtocols() nicht vergessen.

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

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    17.05.2003
    Beiträge
    226

    Seltsam

    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?

    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,
    Kirstin

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von Kirsche
    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?
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    17.05.2003
    Beiträge
    226
    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,
    Kirstin

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    17.05.2003
    Beiträge
    226
    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,
    Geändert von Kirsche (03-01-2006 um 13:42 Uhr)
    Kirstin

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  9. #9
    Registrierter Benutzer
    Registriert seit
    17.05.2003
    Beiträge
    226
    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,
    Kirstin

  10. #10
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  11. #11
    Registrierter Benutzer
    Registriert seit
    17.05.2003
    Beiträge
    226
    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,
    Kirstin

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •