Seite 1 von 1

QByteArray QIODevice::readAll()

Verfasst: 11. Juli 2009 13:24
von pixelflat
Hallo,
ich habe einen funktionieren Code um MD5 Summen von Dateien zu berechnen. Dazu verwende ich QByteArray QIODevice::readAll().

Code: Alles auswählen

QByteArray content = file->readAll();
QString md5 = QCryptographicHash::hash(content, QCryptographicHash::Md5).toHex();
Leider wird ab einer best. Größe (irgendwas ab 1Gb) nichts mehr gelesen. Laut Doc gibt die Funktion ja auch keine Fehler zurück.

Die Frage ist jetzt, was der Grund dafür ist und was ich stattdessen benutzen sollte (QTextStream?). :?

Danke

Verfasst: 11. Juli 2009 13:30
von Christian81
1GB in den Speicher laden und dann wundern das nichts mehr geht? Wow...
Einfach stückchenweise lesen und fertig.

Verfasst: 11. Juli 2009 13:33
von pixelflat
Hm, da hätt ich auch selbst drauf kommen können. :oops:

Stückchenweise lesen? Wie macht man das am besten?

Verfasst: 11. Juli 2009 13:44
von Christian81

Verfasst: 11. Juli 2009 13:51
von pixelflat
Danke für den Link. Damit lässt sich mal was anfangen...

Tut mir leid, dass ich die Doku noch nicht auswendig kann.

Verfasst: 11. Juli 2009 14:00
von Christian81
Es geht nicht darum die Doku auswendig zu lernen sondern einfach mal zu schauen was dort alles steht wenn man sowieso schon readAll() gefunden hat

Verfasst: 11. Juli 2009 14:48
von pixelflat
Was anderes als Links zur Doku oder Begriffen zum Nachschlagen habe ich auch nicht verlangt. Deine Posts kommen nur sehr arrogant rüber.

Ich habe jetzt was lauffähiges zusammen geschrieben:

Code: Alles auswählen

QCryptographicHash md5sum( QCryptographicHash::Md5 );

while (!file->atEnd()) {
   QByteArray line = file->readLine();
   md5sum.addData(line);
}
Ich würde nur noch gerne wissen, obs eine bessere / performantere Lösung gibt.
Edit: Hat sich erledigt...

Verfasst: 11. Juli 2009 15:53
von upsala
Sollte deine Datei kein `\n` enthalten, liest du wieder die gesamte Datei auf einen Rutsch ein.
Verwende read() und eine vernünftige Blockgröße (irgendwas im kByte-Bereich)

Verfasst: 11. Juli 2009 16:21
von pixelflat
Ja, da bin ich auch gerade am experimentieren. Ich brauche für später sowieso die "Teilchen" nicht zeilenweise, sondern byteweise.

Btw, weiß jemand, warum oft 16384 bytes verwendet werden?
Haben 16kb eine besondere Bedeutung beim Dateisystem-Zugriff?

Verfasst: 11. Juli 2009 16:42
von Christian81
Nicht wirklich - solange es irgend eine Potenz von 2 ist sollte es optimal sein.

Verfasst: 11. Juli 2009 19:39
von pixelflat
Hier der aktuelle Stand:

Code: Alles auswählen

QCryptographicHash md5sum( QCryptographicHash::Md5 );
QByteArray content;

char buf[16384];
qint64 lineLength = 2;

while (lineLength != 0)
{
   lineLength = file->read(buf, sizeof(buf));
   if (lineLength != -1)
      content.append(buf, lineLength);
}

md5sum.addData(content);
this->resultText->append(md5sum.result().toHex());
Kleine Dateien funktionieren, bei größeren kommt gar nichts. Ich vermute weil wieder alles in QByteArray gespeichert wird - aber wie muss ichs dann machen? Ich brauch ja für die MD5-Summe alles. :|

Edit: Eigentlich werde ich nie den MD5-Wert von Dateien >1Gb berechnen müssen. Aber wenn dann will ichs schon richtig machen...
Edit: Ok, jetzt hab ichs. Keine Ahnung warum ich noch das ByteArray zusätzlich verwendet hab. Einfach 16kb lesen und an die Funktion übergeben... :roll: Thx anyway.