QByteArray QIODevice::readAll()

Alles rund um die Programmierung mit Qt
Antworten
pixelflat
Beiträge: 8
Registriert: 27. Mai 2009 12:26

QByteArray QIODevice::readAll()

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

1GB in den Speicher laden und dann wundern das nichts mehr geht? Wow...
Einfach stückchenweise lesen und fertig.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
pixelflat
Beiträge: 8
Registriert: 27. Mai 2009 12:26

Beitrag von pixelflat »

Hm, da hätt ich auch selbst drauf kommen können. :oops:

Stückchenweise lesen? Wie macht man das am besten?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
pixelflat
Beiträge: 8
Registriert: 27. Mai 2009 12:26

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
pixelflat
Beiträge: 8
Registriert: 27. Mai 2009 12:26

Beitrag 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...
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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)
pixelflat
Beiträge: 8
Registriert: 27. Mai 2009 12:26

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Nicht wirklich - solange es irgend eine Potenz von 2 ist sollte es optimal sein.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
pixelflat
Beiträge: 8
Registriert: 27. Mai 2009 12:26

Beitrag 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.
Antworten