2009-02-04 15 views
6

¿Es posible abrir un archivo en .NET con acceso de escritura no exclusivo? ¿Si es así, cómo? Mi esperanza es tener dos o más procesos escribiendo en el mismo archivo al mismo tiempo.Cómo abrir un archivo para acceso de escritura no exclusivo usando .NET

Edit: Aquí está el contexto de esta pregunta: Estoy escribiendo un simple HTTPModule de registro para IIS. Dado que las aplicaciones que se ejecutan en diferentes grupos de aplicaciones se ejecutan como procesos distintos, necesito una forma de compartir el archivo de registro entre los procesos. Podría escribir una rutina compleja de bloqueo de archivos, o un escritor lento, pero este es un proyecto descartado, así que no es importante.

Este es el código de prueba que utilicé para descubrir el proceso.

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

supongo que quiere decir que los demás puedan leerlo mientras escribe - parecería extraño que desee permitir que varios escritores. –

Respuesta

7

Use la enumeración FileShare al abrir el archivo con File.Open. Específicamente, use FileShare.ReadWrite.

+0

Incluso con la enumeración de FileShare, no se puede escribir el mismo archivo por más de un proceso a la vez. – hmcclungiii

+1

Claro que sí. Simplemente lo hizo. :) –

-1

No es posible. Aprenda cómo se leen/escriben los archivos en el disco.

Editar: Desde todos los votos a favor, supongo que voy a explicar un poco más. Es absolutamente imposible que más de un proceso escriba en el mismo archivo en el mismo momento exacto. Cuando un proceso está escribiendo, el archivo normalmente no estará disponible para otros escritores, lo que significa que los otros procesos tendrían que esperar hasta que el primer proceso ya no escriba el archivo.

+1

Creo que el autor de la pregunta realmente quiere permitir lecturas mientras escribe, en lugar de múltiples escritores. –

+1

"Mi deseo es tener dos o más procesos escribiendo en el mismo archivo al mismo tiempo". Ya? – hmcclungiii

+0

Nadie está pidiendo nada al mismo tiempo ... – Andrew

6

La clase FileStream tiene una constructor que tiene varias opciones incluyendo FileShare

new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); 
Cuestiones relacionadas