读取文件代码如下:
using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None))
{
using (TextReader tr = new StreamReader(fileStream))
{
string fileContents = tr.ReadToEnd();
}
}
并在下面的文件中写入代码:
using (TextWriter tw = new StreamWriter(fileName))
{
tw.Write(fileContents);
tw.Close();
}
可以看到以下异常详细信息:
The process cannot access the file 'c:\temp\myfile.txt' because it is being used by another process.
避免这种情况的最佳方法是什么?读者是否需要在收到异常后重试,还是有更好的方法?
请注意,读取器进程正在使用 FileSystemWatcher 来了解文件何时更改。
另请注意,在这种情况下,我不是寻找在两个进程之间共享字符串的替代方法。
最佳答案
您可以打开一个文件进行写入并仅锁定写入访问权限,从而允许其他人仍然读取该文件。
例如,
using (FileStream stream = new FileStream(@"C:\Myfile.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.Read))
{
// Do your writing here.
}
其他文件访问只是打开文件只读不写,允许读写共享。
using (FileStream stream = new FileStream(@"C:\Myfile.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
// Does reading here.
}
如果你想确保读者总是读取最新的文件,你将需要使用一个锁定文件来指示有人正在写入文件(尽管如果不小心实现你可能会出现竞争条件) 或确保在打开读取时阻止写入共享并处理异常,以便您可以重试,直到获得独占访问权限。
关于c# - 在 C# 中,如果 2 个进程正在读取和写入同一个文件,避免进程锁定异常的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/222089/