public static void WriteLine(string text)
{
StreamWriter log;
if (!File.Exists(Filename))
{
log = new StreamWriter(Filename);
}
else
{
log = File.AppendText(Filename);
}
在处理此方法时,其他进程也会调用此方法。将出现错误“文件已被其他进程访问”。如何通过等待前一个流程完成来解决这个问题。
答案 0 :(得分:2)
我认为操作系统要等到文件句柄可以自由使用然后写入文件。在这种情况下,您应该尝试获取文件句柄,捕获异常,如果异常是因为该文件被另一个进程访问,那么请等待一小段时间再试一次。
public static void WriteLine(string text)
{
bool success = false;
while (!success)
{
try
{
using (var fs = new FileStream(Filename, FileMode.Append))
{
// todo: write to stream here
success = true;
}
}
catch (IOException)
{
int errno = Marshal.GetLastWin32Error();
if(errno != 32) // ERROR_SHARING_VIOLATION
{
// we only want to handle the
// "The process cannot access the file because it is being used by another process"
// exception and try again, all other exceptions should not be caught here
throw;
}
Thread.Sleep(100);
}
}
}
答案 1 :(得分:1)
两个进程都需要创建FileStream,并指定FileShare写入模式。然后,您也可以删除测试文件是否存在,只需使用Append FileMode。