2010-08-14 235 views
3

下面的代码在while循环中写入文本文件,有时它会产生一个错误,指出“进程无法访问该文件,因为它正在被另一个进程使用”等等。“ 错误通常发生在“使用(的FileStream FS = File.OpenRead(文件路径))” 有不再被使用的方式来检查文件还是有办法妥善处理文本编写的?什么会导致此代码产生文件锁定错误?

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(); 
        } 
+0

你运行的是哪个版本的Windows? – 2010-08-14 21:37:50

+0

恕我直言,我会简化代码以使用文件(AppendAllText,ReadAllText,WriteAllText)的各种静态方法 - 这比记住使用TextWriter实例更简单,例如:) – 2010-08-14 21:48:55

+0

使用Windows 7并在其上进行测试一台Windows XP Pro机器,它也产生了相同的结果。 明天某个时候会尝试James Manning的建议,看看能否更好的工作 – Mike 2010-08-16 07:56:46

回答

0

这里有什么情况发生您释放您要追加的文件以再次阅读它

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

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

+0

我会在明天尝试这个,你是否也认为在将文件内容写入richtextbox的while循环可能会导致这个错误? – Mike 2010-08-16 08:01:45

+0

由于您没有在while循环中释放锁,因此它不应该发生 – 2010-08-16 09:01:13

0

它适合我。你在其他地方使用这个文件吗?也许你在代码中有另一个地方,你错过了Dispose?

我也建议你一直使用using。有几个地方你没有,并抛出异常可能导致你的文件不能正确处理。

+0

是的,它可以在75%的时间内工作,但我需要它在100%或至少95%的时间内工作。你也可以详细说明一些关于“使用”一致的用法,因为我不认为我发布的代码可能有另一个代码没有破坏某些东西 – Mike 2010-08-16 07:59:18

3

我一直使用:

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) 

(区别在于读取的文件共享VS读写)

相关问题