2010-08-14 217 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讀寫)

相關問題