Nehmen wir an, ich den folgenden Code haben:Wie zu zwingen Datei Spülung
#include <chrono>
#include <fstream>
#include <thread>
int main()
{
std::ofstream f("test.log");
int i = 0;
while (true)
{
f << i++;
f.flush();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
(beachten Sie, dass ich einen flush
Anruf nach jedem Schreibvorgang haben)
Ich habe bemerkt, dass diese Anwendung nicht aktualisiert " zuletzt geänderte Zeit "und" Größe "Attribute der" test.log "-Datei, es sei denn, ich mache einen Rechtsklick auf diese Datei oder öffne sie.
Ich vermute, dass dies auf eine interne Pufferung zurückzuführen ist (das System möchte nicht so zeitaufwendige Operationen wie eine tatsächliche I/O auf die Festplatte machen, es sei denn, dazu gezwungen). Habe ich recht?
Ich muss eine Anwendung schreiben, die auf Änderungen in Protokolldateien achten soll, die von anderen Anwendungen erstellt wurden (ich kann sie nicht ändern). Zuerst dachte ich an FileSystemWatcher
Klasse in C#, aber ich habe festgestellt, dass es das gleiche Verhalten (es wird kein entsprechendes Ereignis ausgelöst, wenn Datei in einer Quellanwendung geschlossen wurde oder wurde durch Rechtsklick auf diese Datei in Windows Explorer zu aktualisieren)). Was kann ich dann tun? Rufen Sie WinAPI-Funktionen wie GetFileAttributes
für jede Datei auf, nach der ich so oft wie möglich suchen möchte?
Ich denke, Sie leiden unter Standard-Windows-Pufferung, besonders häufig auf Netzlaufwerken. Da es nicht sofort bemerkt, sind Sie halb dazu verdammt, zu warten, bis Windows das Schreiben auf Platte bestätigt - dies kann auch durch Plattenpufferung verursacht werden, obwohl dies nicht sehr sinnvoll ist, da Windows den Schreibvorgang bei Windows puffert hat es tatsächlich noch nicht begangen, andere Teile sehen es nicht – BugFinder
@Jovasa Nun, Total Commander hat genau das gleiche Verhalten – FrozenHeart
@BugFinder ich sehe. Aber ich habe sowieso ein Problem zu lösen.Ich muss einen korrekten Weg finden, um diese 'Flush's zu erzwingen, die von anderen Anwendungen gemacht wurden. – FrozenHeart