Как открыть файл для неисключительного доступа на запись с использованием .NET - PullRequest
6 голосов
/ 04 февраля 2009

Можно ли открыть файл в .NET с неисключительным доступом для записи? Если так, то как? Я надеюсь, что два или более процесса будут записывать в один и тот же файл одновременно.

Редактировать: Вот контекст этого вопроса: я пишу простой HTTPModule для IIS. Поскольку приложения, работающие в разных пулах приложений, выполняются как отдельные процессы, мне нужен способ совместного использования файла журнала между процессами. Я мог бы написать сложную подпрограмму блокировки файла или ленивый писатель, но это проект, который можно выбросить, поэтому он не важен.

Это тестовый код, который я использовал, чтобы выяснить процесс.

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;
        }
    }
}

Ответы [ 3 ]

7 голосов
/ 04 февраля 2009

Используйте перечисление FileShare при открытии файла с помощью File.Open. В частности, используйте FileShare.ReadWrite.

6 голосов
/ 04 февраля 2009

Класс FileStream имеет конструктор , который принимает несколько параметров, включая FileShare

new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
0 голосов
/ 04 февраля 2009

Не возможно. Узнайте, как файлы читаются / записываются на диск.

Редактировать: Поскольку все отрицательные голоса, я думаю, я объясню немного больше. Совершенно невозможно, чтобы более чем один процесс записывал в один и тот же файл в одно и то же время. Когда один процесс пишет, файл обычно будет недоступен для других авторов, что означает, что другим процессам придется ждать, пока файл больше не будет записан первым процессом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...