Seite 1 von 1

QByteArray bei großen Datenmengen

Verfasst: 13. August 2006 10:39
von ArneStocker
Hallo liebes Forum
ich habe folgende Frage:

Nach dem Kopieren (im Rahmen eines Backups) prüfe ich mit einem Checksummenverfahren ob Ziel und Quelldatei identisch sind. Hierzu verwende ich die Qt - Funktion Qtmd5.

Code: Alles auswählen

bool CheckSumm(const QString& source, const QString& dest)
{
    bool check = false;
    QString sourceCheckSumme, destCheckSumme;
    // Checksumme für source
    QFile sourceFile(source);
    if (sourceFile.open(IO_ReadOnly) == true) {
        sourceCheckSumme = qtMD5(sourceFile.readAll());
        sourceFile.close();
    }
    // Checksumme für dest
    QFile destFile(dest);
    if (destFile.open(IO_ReadOnly) == true) {
        destCheckSumme = qtMD5(destFile.readAll());
        destFile.close();
    }
    // Checksummen vergleichen
    if  ( (destCheckSumme.isEmpty() == false) && 
          (destCheckSumme == sourceCheckSumme) )
    {
        check = true;
    }
    return check;
}
Was passiert eigentlich mit dem Aufruf QFile::readAll(), wenn die Größe der Datei den Arbeitsspeicher übersteigt (bei einer Datenbankdatei durchaus möglich) ? Natürlich kann ich dass alles in einem try-catch-modus laufen lassen, aber gewußt hätte ich es schon gerne. Hat jemand eine Idee ?

Gruß Arne

Verfasst: 13. August 2006 11:37
von BartSimpson
Das QByteArray kann eh nur max. 4GB groß werden.
Ein Blick die Doku wird dir verraten, das das Array die Größe 0 hat, wenn readAll scheitert.

Verfasst: 13. August 2006 12:07
von Tarek
Meinst du nicht dass es etwas ineffizient ist erst alles in den RAM zu laden und dann die Prüfsumme zu berechnen? Stell dir mal vor ein kleines MD5-Tool brächte 4,7GB RAM um den Hash eines DVD-Images zu berechnen. Am besten du berechnest den Hash in kleineren Blöcken, das geht zwar nicht mir der Qt-Funktion aber es gibt ja genug freie MD5-Implementierungen im Netz.

Verfasst: 14. August 2006 08:01
von ArneStocker
OK, überzeugt, da werde ich wohl noch ein wenig nacharbeiten müssen.

Danke für die Antworten

Arne