2009-02-04 12 views
6

Ist es möglich, eine Datei in .NET mit nicht exklusiven Schreibzugriff zu öffnen? Wenn das so ist, wie? Ich hoffe, dass zwei oder mehr Prozesse gleichzeitig in dieselbe Datei schreiben.So öffnen Sie eine Datei für nicht-exklusiven Schreibzugriff mit .NET

Bearbeiten: Hier ist der Kontext dieser Frage: Ich schreibe eine einfache Protokollierung HTTPModule für IIS. Da Anwendungen, die in verschiedenen App-Pools ausgeführt werden, als separate Prozesse ausgeführt werden, muss die Protokolldatei zwischen Prozessen geteilt werden. Ich könnte eine komplexe Dateisperrroutine oder einen faulen Autor schreiben, aber das ist ein Wegwerfprojekt, also ist es nicht wichtig.

Dies ist der Testcode ich den Prozess, herauszufinden, verwendet.

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.IO; 
using System.Threading; 

namespace FileOpenTest 
{ 
    class Program 
    { 
     private static bool keepGoing = true; 

     static void Main(string[] args) 
     { 
      Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress); 

      Console.Write("Enter name: "); 
      string name = Console.ReadLine(); 
      //Open the file in a shared write mode 
      FileStream fs = new FileStream("file.txt", 
              FileMode.OpenOrCreate, 
              FileAccess.ReadWrite, 
              FileShare.ReadWrite); 

      while (keepGoing) 
      { 
       AlmostGuaranteedAppend(name, fs); 
       Console.WriteLine(name); 
       Thread.Sleep(1000); 
      } 

      fs.Close(); 
      fs.Dispose(); 
     } 

     private static void AlmostGuaranteedAppend(string stringToWrite, FileStream fs) 
     { 
      StreamWriter sw = new StreamWriter(fs); 

      //Force the file pointer to re-seek the end of the file. 
      //THIS IS THE KEY TO KEEPING MULTIPLE PROCESSES FROM STOMPING 
      //EACH OTHER WHEN WRITING TO A SHARED FILE. 
      fs.Position = fs.Length; 

      //Note: there is a possible race condition between the above 
      //and below lines of code. If a context switch happens right 
      //here and the next process writes to the end of the common 
      //file, then fs.Position will no longer point to the end of 
      //the file and the next write will overwrite existing data. 
      //For writing periodic logs where the chance of collision is 
      //small, this should work. 

      sw.WriteLine(stringToWrite); 
      sw.Flush(); 
     } 

     private static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e) 
     { 
      keepGoing = false; 
     } 
    } 
} 
+0

Ich nehme an, Sie bedeuten, dass andere sie lesen können, während Sie schreiben - es scheint seltsam mehrere Autoren ermöglichen zu wollen. –

Antwort

7

Verwenden Sie die FileShare Aufzählung, wenn die Datei mit File.Open öffnen. Verwenden Sie insbesondere FileShare.ReadWrite.

+0

Selbst mit der FileShare-Enumeration kann nicht gleichzeitig an dieselbe Datei von mehr als einem Prozess geschrieben werden. – hmcclungiii

+1

Sicher kann es. Habe es gerade getan. :) –

-1

Nicht möglich. Erfahren Sie, wie Dateien auf Disc gelesen/geschrieben werden.

Edit: Da alle downvotes, ich denke, ich eine wenig erklären werde. Es ist absolut unmöglich, dass mehr als ein Prozess zur selben Zeit in dieselbe Datei schreibt. Wenn ein Prozess schreibt, ist die Datei normalerweise für andere Writer nicht verfügbar, was bedeutet, dass die anderen Prozesse warten müssen, bis die Datei vom ersten Prozess nicht mehr beschrieben wird.

+1

Ich glaube, der Fragesteller will tatsächlich lesen, während er schreibt, anstatt mehrere Autoren. –

+1

"Ich hoffe, dass zwei oder mehr Prozesse gleichzeitig in dieselbe Datei schreiben." Ja? – hmcclungiii

+0

Niemand fragt genau zur gleichen Zeit nach etwas ... – Andrew

6

Die Filestream-Klasse eine constructor hat, die mit mehreren Optionen nimmt FileShare

new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); 
Verwandte Themen