Процесс не может получить доступ к файлу, потому что он используется другим процессом
Когда я выполняю код ниже, я получаю общее исключение 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 ответа
Если у вас есть несколько потоков, пытающихся получить доступ к одному и тому же файлу, рассмотрите возможность использования механизма блокировки. Самая простая форма может быть:
lock(someSharedObject)
{
using (var fs = File.Open(filePath, FileMode.Append)) //Exception here
{
using (var sw = new StreamWriter(fs))
{
sw.WriteLine(text);
}
}
}
В качестве альтернативы рассмотрим:
File.AppendText(text);
Вы можете установить FileShare
чтобы разрешить множественный доступ с этим File.Open
команда как
File.Open(path, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)
Но я думаю, что самым чистым способом, если у вас есть несколько потоков, которые пытаются записать в один файл, было бы поместить все эти сообщения в Queue<T>
и иметь один дополнительный поток, который записывает все элементы очереди в файл.