Ich versuche, eine riesige Textdatei mit C # zu erzeugen, und ein anderer Prozess schaut ständig auf den Speicherort und versucht, die Datei abzurufen, falls verfügbar.
Um die Datei atomar unten zu machen, sind die Schritte:
%Vor%Da C # kein Umbenennen hat, muss ich mich auf File.Move verlassen, stellt dies sicher, dass die Verschiebungsoperation atomar ist oder gibt es eine andere Möglichkeit, diese Atomizität zu erreichen?
Laut dem MSDN Blog-Artikel Wie atomare Schreibvorgänge in einer Datei durchgeführt werden , das Umbenennen einer NTFS-Datei ist eine atomare Operation:
Die Lösung? Erinnern wir uns daran, dass Metadatenänderungen atomar sind. Umbenennen ist ein solcher Fall. Also können wir einfach das Schreiben in eine temporäre Datei ausführen, und nachdem wir wissen, dass die Schreibvorgänge auf der Festplatte sind (abgeschlossen und geleert), können wir die alte Datei mit der neuen Datei austauschen.
Zugegeben, dies garantiert nicht, dass File.Move
nur einen NTFS-Umbenennungsvorgang ausgibt, aber ich kann mir keinen vernünftigen Grund vorstellen, warum es etwas komplizierter machen sollte.
File.Move sollte umbenannt werden, wenn sich Quelle und Ziel auf demselben Volume befinden. Unabhängig von der Dateigröße sollte der Move also 'instant' sein. Ich nehme an, dass das deine Sorge ist?
Aus einer FAQ von einem MS-Mitarbeiter auf Ссылка haben wir;
'Häufig gestellte Frage: Ist MoveFileEx unteilbar, wenn sich die vorhandenen und neuen Dateien auf demselben Laufwerk befinden?
Die einfache Antwort ist "normalerweise, aber in einigen Fällen wird sie stillschweigend auf eine nicht-atomare Methode zurückfallen, also zählen Sie nicht darauf."
Ich denke, wenn es 100% kritisch ist, könntest du Transaktions-NTFS betrachten. Ich bin mir nicht sicher, ob Wrapper in .Net für diese noch, also müssen Sie möglicherweise P / Invoke verwenden.
Sie können Ihre Datei direkt in das Ziel schreiben und eine Signaldatei mit einer Größe von null verwenden, die erstellt wird, nachdem Sie eine große Datei erstellt haben. Ihr Reader-Prozess kann nach einer Signaldatei suchen und eine große Datei lesen, nachdem die Signaldatei verfügbar ist. Ich denke, das kann das Problem der "Atomarität" lösen.