什么会导致此代码产生文件锁定错误?

时间:2010-08-14 21:11:28

标签: c# .net file

下面的代码写入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();
                    }

4 个答案:

答案 0 :(得分:5)

我一直用:

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)

(不同之处在于ReadShare与ReadWrite的文件共享)

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这里发生的是你释放你想要再次阅读的文件。

sud.Close()using(FileStream fs = File.OpenRead(filePath))之间,您计算机上运行的任何其他进程都可以查看并锁定您的文件。索引服务或反病毒通常会对此产生负责。

尝试禁用该文件夹的索引,并查看您的错误是否仍然频繁发生。

答案 3 :(得分:0)

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

我还建议您始终使用using。有几个地方你没有,抛出异常可能会导致文件无法正确处理。