2009-12-07 3 views
18

Unter den meist Unix-Varianten und Posix konformen Betriebssysteme einen open() Betriebssystemaufruf durchführt mit der O_APPEND an das O angibt, schreibt atomaren append sein und Schreiboperationen. Mit diesem Verhalten wissen Sie, dass lokale Dateisysteme beim Schreiben an das Ende der Datei angehängt werden.Wie kann ich eine atomare schreiben/anhängen in C#, oder wie bekomme ich Dateien mit dem Flag FILE_APPEND_DATA geöffnet?

Die Windows-Betriebssysteme unterstützen die gleiche Funktionalität durch FILE_APPEND_DATA in den entsprechenden Parameter auf die Win32 Createfile() Systemaufruf übergeben.

Referenzen:

http://www.google.com/search?q=msdn+createfile 
or: http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx 

http://www.google.com/search?q=msdn+IoCreateFileSpecifyDeviceObjectHint 
or: http://www.google.com/search?q=msdn+IoCreateFileSpecifyDeviceObjectHint 

Mein Problem ist, das kann ich nicht bestimmen, wie dieses Verhalten unter C# Bibliotheken unter Verwendung der Net Framework, zu erhalten, ist es eine Möglichkeit, ein solches Verhalten mit dem Net Framework zu bekommen? Ich glaube nicht, dass die Verwendung von FileMode.Append ein solches Verhalten übrigens gibt.

Antwort

30

Verwenden Sie eine der Überlastung des FileStream Konstruktor:

new FileStream(FileName, FileMode.Open, FileSystemRights.AppendData, 
      FileShare.Write, 4096, FileOptions.None) 

FileSystemRights.AppendData mit FILE_APPEND_DATA entspricht

Filestream scheint auf Pufferung zu bestehen, so stellen Sie sicher, ist der Puffer groß genug für jede Schreib- und Anruf Flush() nach jedem schreiben.

Tiny Beispiel:

private void button1_Click(object sender, EventArgs e) { 
     Thread t1 = new Thread(DoIt); 
     Thread t2 = new Thread(DoIt); 
     t1.Start("a"); 
     t2.Start("b"); 
     Thread.Sleep(2000); 
     Environment.Exit(0); 
    } 

    private void DoIt(object p) { 
     using (FileStream fs = new FileStream(FileName, FileMode.Open, FileSystemRights.AppendData, 
      FileShare.Write, 4096, FileOptions.None)) { 
      using (StreamWriter writer = new StreamWriter(fs)) { 
       writer.AutoFlush = true; 
       for (int i = 0; i < 20; ++i) 
        writer.WriteLine("{0}: {1:D3} {2:o} hello", p, i, DateTime.Now); 
      } 
     } 
    } 
+0

Fred, das ist eine tolle Antwort. – Cameron

+0

Ist das die gleiche wie die 'File.AppendText' API? – Ben

+0

Der letzte Parameter des Filestream-Konstruktor ‚buffer‘ oder 4096 in diesem Beispiel wird eine obere Grenze für die Länge einer atomaren Schreib sein. – Cameron

-1

Warum können Sie nicht

verwenden
System.IO.File.AppendAllText("C:\\somefile.txt", "some content"); 

? Das ist auch ein thread-sicherer/"atomarer" Aufruf.

+5

Diese unfortunatly den Prozess nicht weise atomare Operation nicht geben, die ich suche. – Cameron

Verwandte Themen