Процесс не может получить доступ к файлу, потому что он используется другим процессом - PullRequest
2 голосов
/ 11 августа 2010

Когда я выполняю код ниже, я получаю общее исключение The process cannot access the file *filePath* because it is being used by another process.

Какой самый эффективный способ разрешить этой теме ждать, пока она не сможет безопасно получить доступ к этому файлу?

Допущения:

  • файл был только что создан мной, поэтому маловероятно, что другое приложение получит к нему доступ.
  • более одного потока из моего приложения могут пытаться запустить этот код для добавления текста в файл.

:

 using (var fs = File.Open(filePath, FileMode.Append)) //Exception here
 {
     using (var sw = new StreamWriter(fs))
     {
         sw.WriteLine(text);
     }
 }

Пока что лучшее, что я придумал, это следующее. Есть ли недостатки в этом?

    private static void WriteToFile(string filePath, string text, int retries)
    {
        const int maxRetries = 10;
        try
        {
            using (var fs = File.Open(filePath, FileMode.Append))
            {
                using (var sw = new StreamWriter(fs))
                {
                    sw.WriteLine(text);
                }
            }
        }
        catch (IOException)
        {
            if (retries < maxRetries)
            {
                Thread.Sleep(1);
                WriteToFile(filePath, text, retries + 1);
            }
            else
            {
                throw new Exception("Max retries reached.");
            }
        }
    }

Ответы [ 2 ]

3 голосов
/ 11 августа 2010

Если у вас есть несколько потоков, пытающихся получить доступ к одному и тому же файлу, рассмотрите возможность использования механизма блокировки.Самая простая форма может быть:

lock(someSharedObject)
{
    using (var fs = File.Open(filePath, FileMode.Append)) //Exception here
    {
        using (var sw = new StreamWriter(fs))
        {
            sw.WriteLine(text);
        }
    }
}

В качестве альтернативы рассмотрим:

File.AppendText(text);
2 голосов
/ 11 августа 2010

Вы можете установить FileShare, чтобы разрешить множественный доступ с помощью этой команды File.Open, например

File.Open(path, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)

Но я думаю, что самый чистый способ, если выиметь несколько потоков, которые пытаются записать в один файл, было бы помещать все эти сообщения в Queue<T> и иметь один дополнительный поток, который записывает все элементы очереди в файл.

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