【问题标题】:What would cause this code to produce a file lock error?什么会导致此代码产生文件锁定错误?
【发布时间】:2010-08-14 21:11:27
【问题描述】:

下面的代码在一个while循环中写入一个文本文件,有时它会产生一个错误,说“该进程无法访问该文件,因为它被另一个进程使用”等等......“ 错误通常发生在“使用 (FileStream fs = File.OpenRead(filePath)) ” 有没有办法检查文件不再被使用或正确处理文本编写器?

 if (File.Exists(filePath))
                {
                        TextWriter sud = File.AppendText(filePath);
                        sud.WriteLine(GenericLIST[testloop].ToString());
                        sud.Close();
                        sud.Dispose();
                        using (FileStream fs = File.OpenRead(filePath)) 
                        {
                            using (StreamReader sr = new StreamReader(fs))
                            {
                                while (!sr.EndOfStream)
                                {
                                    richTextBox1.AppendText(sr.ReadLine());
                                }
                            }
                        } 
                    }

                else
                {

                    TextWriter sud = new StreamWriter(filePath);
                    sud.WriteLine(GenericLIST[testloop].ToString());
                    sud.Close();
                    sud.Dispose();
                    }

【问题讨论】:

  • 您运行的是什么版本的 Windows?
  • 恕我直言,我会简化代码以使用 File 的各种静态方法(AppendAllText、ReadAllText、WriteAllText)——这比记住使用 TextWriter 实例更简单,例如 :)
  • 使用 Windows 7 并在 Windows XP Pro 机器上进行了测试,并产生了相同的结果。明天某个时候会试试 James Manning 的建议,看看效果是否更好

标签: c# .net file


【解决方案1】:

我一直用:

using (StreamReader reader = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
{
}

根据MSDN,File.OpenRead 同:

new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read)

(Read 与 ReadWrite 的 FileShare 的区别)

【讨论】:

    【解决方案2】:

    使用优秀的 ProcMon 并让它过滤对文件的所有访问,您应该看到哪些其他进程正在访问该文件。我过去曾用它来做这个,它很棒。

    http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

    【讨论】:

      【解决方案3】:

      这里发生的情况是您释放了您附加的文件以再次读取它。

      sud.Close()using(FileStream fs = File.OpenRead(filePath)) 之间,您计算机上运行的任何其他进程都可以查看并锁定您的文件。索引服务或防病毒软件经常犯此错误。

      尝试禁用对文件夹的索引,看看你的错误是否仍然如此频繁地发生。

      【讨论】:

      • 我明天也试试这个,你认为将文件内容写入richtextbox时的while循环可能会导致这个错误吗?
      • 由于你没有在while循环中释放锁,所以它不应该发生
      【解决方案4】:

      它对我有用。你在其他地方使用这个文件吗?也许您的代码中有另一个地方缺少 Dispose?

      我还建议您始终使用using。有几个地方您没有这样做,并且那里引发的异常可能会导致您的文件无法正确处理。

      【讨论】:

      • 是的,它在 75% 的时间里工作,但我需要它在 100% 或至少 95% 的时间里工作。您还可以详细说明“使用”的用法吗?因为我不认为我发布的代码可以在不破坏某些东西的情况下使用另一个代码
      猜你喜欢
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 2012-01-15
      相关资源
      最近更新 更多