c#如果该文件由另一个进程处理,如何访问文件?

时间:2010-12-12 09:08:41

标签: c# file

 public static void WriteLine(string text)
    {
        StreamWriter log;

        if (!File.Exists(Filename))
        {
            log = new StreamWriter(Filename);
        }
        else
        {
            log = File.AppendText(Filename);
        }

在处理此方法时,其他进程也会调用此方法。将出现错误“文件已被其他进程访问”。如何通过等待前一个流程完成来解决这个问题。

2 个答案:

答案 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。