Seite 1 von 1

Kopierte Textdateien miteinander abgleichen (QFile)

Verfasst: 25. November 2014 14:13
von heha
Hallo zusammen,

wir haben vor kurzem bei uns in der Firma auch angefangen QT ein zu setzen. Jetzt stehe ich vor dem ersten Problem, für welches ich im Internet bislang leider noch keine für mich passende Lösung gefunden habe.

Und zwar wird in einem meiner Programme eine QFile Kopierfunktion gestartet. Am Ende des Kopiervorgangs frage ich ab, ob die Datei am Zielort auch existiert mit QFile::exists. Erst dann wird die zu kopierende Datei gelöscht.

Gerne hätte ich eine Funktion, die es nicht nur ermöglicht ab zu fragen, ob die Datei existiert, sondern auch gegenprüft, ob der Inhalt der selbe ist.

Ich stelle mir eine Funktion wie folgt vor : QFile File1, File2 - if(file1 = file2) { ... } else ....

Kann mir da jemand helfen?

Vielen Dank und beste Grüße
Kevin

Re: Kopierte Textdateien miteinander abgleichen (QFile)

Verfasst: 25. November 2014 18:19
von Christian81
Beide Dateien lesen und entweder direkt den Inhalt vergleichen und/oder einen Hash-Wert berechnen und diesen vergleichen. Wenn man allerdings eine Datei kopiert hat dann ist sie auch gleich. Und wenn es Schreibfehler gibt wirst Du sie mit dieser Methode wohl auch nicht finden da der Dateiinhalt wohl noch im Betriebssystem-Cache vorliegt.

Re: Kopierte Textdateien miteinander abgleichen (QFile)

Verfasst: 26. November 2014 07:39
von heha
Leider ist es eine Vorgabe in einem Projekt, die kopierte Datei auf vollständigkeit zu prüfen. Ansonsten gebe ich Dir im Normalfall natürlich Recht!

Kannst Du mir die erste Variante (Lesen / Inhalt vergleichen) einmal kurz versuchen zu erklären? Weche Funktion nutze ich dafür ?

Vielen Dank und liebe Grüße
Kevin

Re: Kopierte Textdateien miteinander abgleichen (QFile)

Verfasst: 26. November 2014 09:04
von dazedly
Du kannst Zeilenweise vergleichen mit readLine, oder du kannst die ganze Datei einlesen und als QByteArray vergleichen. QFile kannst du zum vergleichen vergessen, du musst es schon auslesen (QDataStream).

Re: Kopierte Textdateien miteinander abgleichen (QFile)

Verfasst: 26. November 2014 13:30
von heha
Prima, vielen Dank!

Habe es nun mit der QByteArray Funkion realisiert bekommen.
Hashwert generiert und entsprechend verglichen!

Re: Kopierte Textdateien miteinander abgleichen (QFile)

Verfasst: 1. Dezember 2014 19:04
von softwaremaker
Na wenn dann machen wir ein bisschen Code dazu, damit jeder sieht wie es gehen könnte.
Diese Funktion liefert den MD5-Hash einer Datei zurück. Den Hash von 2 Dateien kann man mit QString::compare vergleichen. Die Funktion funktioniert problemlos mit Riesen-Dateien, da die Datei in 10 MB - Blöcken gelesen wird.

Code: Alles auswählen

QString MainWindow::GetFileHash( QString filename )
{
    QCryptographicHash hash_md5(  QCryptographicHash::Md5  );
    QFile file( filename );
    if ( !file.open( QFile::ReadOnly ) )  return QString();
    QByteArray  data;
    while( !file.atEnd() )
    {
        data = file.read( 10000000 );
        hash_md5.addData( data );
    }
    QByteArray hash = hash_md5.result();
    return QString( hash.toHex().toUpper() );
}