Datei auf Festplatte schreiben und Werte ermitteln
-
hallo,
in meinem Programm lasse ich wärend des Schreibens einer Datei eine Progressbar laufen und errechne zusätzlich die Schreibgeschwindigkeit. Das sieht ungefähr so aus:
datei = fopen(filename, "wb"); if(!datei){ return FALSE; } gesamt = 0; start_time = timeGetTime(); while(gesamt != buffer_size){ if((buffer_size - gesamt) < gesamt){ result = fwrite((Buffer + gesamt), 1, (buffer_size - gesamt), datei); }else{ result = fwrite((Buffer + gesamt), 1, blocksize, datei); } gesamt += result; now = timeGetTime(); MyFunction_SetProgressMeter(buffer_size, gesamt); MyFunction_CalculateSpeed(start_time, now, gesamt); } fclose(datei); return FALSE;
Irgendwie sagten mir nun die Werte, dass die Datei (z.B. Größe 1GB) komplett geschrieben wurde, aber in Wirklichkeit wird noch kräftig auf die HDD geschrieben. Ich glaube irgendwo mal gelesen zu haben, das dieses Verhalten normal ist, was muss ich also tun damit mein Programm so funktioniert wie es soll? Also genau die Werte erfassen die auch auf der HDD gelandet sind?
-
Ned viel Zeit, vllt hilft das
http://www.c-plusplus.net/forum/176280
http://www.c-plusplus.net/forum/291421
-
Nein, ohne, dass Du das Schreiben selbst verlangsamst, wirst Du das nicht erfassen können... und ungepuffertes Schreiben, deswegen einzuführen ist es nicht wert, und zudem meistens langsamer.
Caching und Bugffering des IO/s sind tief im OS verankert. Was wirklich schon weg ist, weißt Du nicht.
-
Naja...
Du könntest alle 10 MB mal ein FlushFlushBuffers() machen.
Nachdem FlushFileBuffers() (ohne Fehler) zurückkommt ist garantiert dass alles was bis dahin geschrieben wurde auf der Platte steht.Wenn du das zu häufig machst, wäre das böse, da du das System zwingst schlechter zu optimieren. Alle 10 MB sollte mMn. OK sein.
Bzw. wenn nicht der ganze Progress dazwischen "korrekt" sein muss, sondern nur der Wechsel von "kopiere noch" zu "haben fertig" nicht zu früh angezeigt werden soll, dann reicht ein einziges FlushFileBuffers() am Ende (vor dem close).
-
Nachdem FlushFileBuffers() (ohne Fehler) zurückkommt ist garantiert dass alles was bis dahin geschrieben wurde auf der Platte steht.
Mit Sicherheit nicht.
-
There's simply too many levels of abstraction to be absolutely sure that the data is written to the disc, right down to the hardware level.
-
Blödsinn.