2013-03-07 28 views
8

Ich versuche, eine riesige Textdatei mit C# zu generieren, und ein anderer Prozess schaut ständig auf den Speicherort und versucht, die Datei abzuholen, falls verfügbar.File.Move atomare Operation

Um die Datei Atom unten sind die Schritte zu machen:

1 - Write to file : Filename_temp.txt 
2 - Check if Filename.txt already exists then Delete 
3 - Do a File.Move to the same destination  
    From filename : Filename_temp.txt 
    TO : Filename.txt 

Da eine Umbenennungs C# nicht, ich auf File.Move verlassen haben, ist dies der Verschiebungsvorgang sein sicherstellen, dass Atom Oder gibt es einen anderen Weg, diese Atomarität zu erreichen?

+1

was genau meinen Sie damit, indem Sie sagen: atomare bewegung? – Tigran

+0

Können Sie beide Anwendungslogik aktualisieren? Wenn ja - benutze Mutex um den Zugriff zu synchronisieren – sll

+0

Ich empfehle zuerst zu prüfen, ob es existiert und löscht. Sie wissen nie, wann 'Filename_temp.txt' bereits existiert. – Nolonar

Antwort

12

Nach dem MSDN-Blog Artikel How to do atomic writes in a file, eine NTFS-Datei ist eine atomare Operation Umbenennung:

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, garantiert dies nicht, dass File.Move gibt nur eine NTFS-umzubenennen, aber ich kann aus einem triftigen Grund nicht, warum es etwas komplizierter machen sollte.

+6

Sicher gibt es einen Grund: Die Datei könnte auf ein anderes Gerät verschoben werden. – PythonNut

3

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 Sie sich Sorgen machen?

Aus einer FAQ von einem MS-Mitarbeiter auf http://msdn.microsoft.com/en-gb/library/windows/desktop/aa365240%28v=vs.85%29.aspx haben wir;

'Häufig gestellte Frage: Ist MoveFileEx unteilbar, wenn die vorhandenen und neuen Dateien beide auf demselben Laufwerk sind?

Die einfache Antwort ist "normalerweise, aber in einigen Fällen wird es still auf eine nicht-atomare Methode zurückfallen, also zähle nicht darauf".

Ich denke, wenn es 100% kritisch ist, könnten Sie 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.

+0

Genau, ist das irgendwo dokumentiert? –

+0

Kann im Moment nichts finden, es ist eher ein Feature von NTFS als .Net. Wird versuchen, Referenzen zu finden. –

+0

+1. In diesem Punkt scheint es widersprüchliche Quellen * von Microsoft * zu geben. – Heinzi

0

Sie können Ihre Datei direkt an das Ziel schreiben und eine Signaldatei mit der Größe null verwenden, die erstellt wird, nachdem Sie die große Datei fertig gestellt 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 "Atomizitäts" -Problem lösen.

+0

Grundsätzlich die Semaphor-Dateien, die DONE anzeigen, aber dies erfordert, dass sich der Beobachtungsprozess ändert, was leider außerhalb meiner Grenzen liegt. –

Verwandte Themen