How to open a file for non-exclusive write access using .NET.

Is it possible to open a file in .NET with non-exclusive write access? If so, how? I hope that two or more processes will be written to the same file at the same time.

Edit: Here is the context of this question: I am writing a simple HTTPModule protocol for IIS. Since applications running in different application pools run as separate processes, I need a way to share the log file between processes. I could write a complicated file locking procedure or a lazy writer, but this is a project with a throwaway, so its not important.

This is the test code I used to determine the process.

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; } } } 
+6
file-io
source share
3 answers

Use FileShare enumeration when opening a file using File.Open. In particular, use FileShare.ReadWrite.

+7
source share

The FileStream class has a constructor that accepts several parameters, including FileShare

 new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); 
+6
source share

Impossible. Find out how files are read / written to disk.

Edit: Since all are downvotes, I think I will explain a little more. It is absolutely impossible for more than one process to be written to the same file at the same time. When one process writes, the file is usually inaccessible to other authors, which means that other processes will have to wait until the file is written by the first process.

-one
source share

All Articles