¿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;
}
}
}
supongo que quiere decir que los demás puedan leerlo mientras escribe - parecería extraño que desee permitir que varios escritores. –