2016-05-26 8 views
0

Ich habe ein Win32-Programm, das eine Datei geöffnet hält und Daten über einen Zeitraum von mehreren Stunden schreibt. Ich möchte, dass die Dateigröße, wie sie in einem Explorer-Fenster angezeigt wird, von Zeit zu Zeit aktualisiert wird.Wie bekomme ich ein Win32-Programm, um die Dateigröße zu aktualisieren, während ich noch Dateien schreibe?

Wenn beispielsweise ein Browser eine große Datei herunterlädt, kann sich die Dateigröße im Laufe der Zeit ändern, obwohl die Datei noch heruntergeladen wird.

Mit meiner aktuellen naiven Implementierung bleibt die Dateigröße Null, bis ich die Datei schließe.

Wie mache ich das in Win32? Derzeit ist die Datei unter Verwendung von std::ofstream geöffnet. Ist dies eine ordnungsgemäße Anwendung von std::ostream::flush()? Oder muss ich die Datei mit einiger Regelmäßigkeit schließen und erneut öffnen?

+3

https://blogs.msdn.microsoft.com/oldnewthing/20111226-00/?p=8813 –

Antwort

1

std::ostream::flush() stellt sicher, dass Sie Ihre Daten sicher auf der Festplatte haben. Das Löschen des Puffers ist ein gültiger Anwendungsfall in Situationen, in denen die automatischen Löschvorgänge nicht gut genug für Sie sind (zB wenn zu lange Daten zu wenig geschrieben werden, die Daten ständig geschrieben werden, aber auch ständig zugänglich sein müssen, müssen Sie sein) Sicherstellen, dass die Daten im Falle eines Absturzes oder eines Stromausfalls protokolliert werden usw.); Bei einigen OS/Dateisystem-Kombinationen (siehe Why is the file size reported incorrectly for files that are still being written to?) wird die Dateigröße dennoch nicht entsprechend aktualisiert. Auf Win32 werden Größenupdates normalerweise nicht angezeigt, bevor das Handle tatsächlich geschlossen/wieder geöffnet wird. manchmal hilft das erneute Lesen des Verzeichnisses usw., und manchmal wird es einfach nicht funktionieren.

Als solche können Sie z.B. ReOpenFile, um diese Aktualisierung zu erzwingen, oder verwenden Sie einfach close/open anstelle von flush. Die genaue Lösung hängt davon ab, ob Sie die aktualisierte Dateigröße so dringend brauchen und die reduzierte Ausgaberate kein echtes Problem ist (in diesem Fall ist Wiedereröffnung die beste Option), oder wenn Sie mit einer falschen Größe leben können (in diesem Fall flushes) sind Ihre beste Wahl IMO).

+0

Danke, es stellt sich heraus, ich musste nur F5 drücken, um das Explorer-Fenster zu aktualisieren. Ich versuchte flush() und den Wiedereröffnungstrick, und obwohl diese nichts taten, musste ich den Explorer manuell aktualisieren. – Sonicsmooth

Verwandte Themen