2013-01-09 152 views
1

這裏是使用從文本文件中讀寫的代碼。將文本框中的數據寫入文本文件

StreamWriter sw1 = new StreamWriter("DataNames.txt"); 
sw1.WriteLine(textBox1.Text); 
sw1.Close(); 
StreamWriter sw2 = new StreamWriter("DataNumbers.txt"); 
sw2.WriteLine(textBox2.Text); 
sw2.Close(); 
FileInfo file1 = new FileInfo("DataNames.txt"); 
StreamReader sr1 = file1.OpenText(); 
while (!sr1.EndOfStream) 
{ 
    listBox1.Items.Add(sr1.ReadLine()); 
} 
FileInfo file2 = new FileInfo("DataNumbers.txt"); 
StreamReader sr2 = file2.OpenText(); 
while (!sr2.EndOfStream) 
{ 
    listBox2.Items.Add(sr2.ReadLine()); 
} 

的事情是,當我點擊我的按鈕將數據從我的文本框保存到我的文本文件出現錯誤,指出「該進程無法訪問文件「C:\ XXXX \ XXXXXX \ XXXXX \ XXXX \ xxxxx \ xxxxx.txt',因爲它正在被另一個進程使用。「

誰能告訴我爲什麼我有這樣的錯誤,也許幫我解決它

+0

歡迎您的閱讀部分。此外,由於您是StackOverflow的新用戶,因此我想告訴您,您可以通過查看答案旁邊的勾號來獲得最佳答案並接受最能幫助您的答案。在這個網站上upvote或接受的答案算作「謝謝」。 –

回答

1

您需要Close StreamReader對象,一旦你不需要它了。這應該解決這個問題。 也就是說

StreamReader sr1 = file1.OpenText(); 
try { 
      while (!sr1.EndOfStream) 
      { 
       listBox1.Items.Add(sr1.ReadLine()); 
      } 
} 
finally { 
    sr1.Close(); 
} 
      FileInfo file2 = new FileInfo("DataNumbers.txt"); 
      StreamReader sr2 = file2.OpenText(); 
try { 
      while (!sr2.EndOfStream) 
      { 
       listBox2.Items.Add(sr2.ReadLine()); 
      } 
} 
finally { 
    sr2.Close(); 
} 
+2

我建議使用'using'。 –

+0

@HamletHakobyan,是的,它也可以使用,因爲StreamReader實現了IDisposable。感覺是絕對相同的,Dispose調用裏面的Close方法... – platon

1

您已打開文件但未關閉。

StreamReader sr1 = file1.OpenText(); 
StreamReader sr2 = file2.OpenText(); 
0

我以前見過這種行爲 - 通常還有另一個打開過程阻止文件訪問。你的任務欄中是否打開了多個開發服務器? (奇怪的,是的,但我已經看到了這一點)

+0

是的是的抱歉,夥計其因爲我還沒有關閉它我知道這是問題,但我試圖關閉file1和file2,我需要關閉sr1和sr2 – BorisTheBlade

+0

@BorisTheBlade看看'sa_ddam213'解決方案,它更加優化,並且在我看來更具可讀性,它應該可以讓您輕鬆地繼續前進。快樂編碼 – MethodMan

4

嘗試添加在你流的using statment,以確保它們是Disposed否則該文件仍然鎖定在流

例子:

//Write 
    using (StreamWriter sw1 = new StreamWriter("DataNames.txt")) 
    { 
     sw1.WriteLine(textBox1.Text); 
    } 

    using (StreamWriter sw2 = new StreamWriter("DataNumbers.txt")) 
    { 
     sw2.WriteLine(textBox2.Text); 
    } 


    // Read 
    foreach (var line in File.ReadAllLines("DataNames.txt")) 
    { 
     listBox1.Items.Add(line); 
    } 

    foreach (var line in File.ReadAllLines("DataNumbers.txt")) 
    { 
     listBox2.Items.Add(line); 
    } 
+0

這是一個更好的解決方案,當你可以使用'File.ReadAllLines'方法 – MethodMan

1

您的問題發生,因爲您沒有關閉流讀取器。

使用外部資源(在這種情況下,文件)的更安全的方法是嵌入他們在using語句中使用。 using語句會自動關閉語句塊末尾的資源,或者如果語句塊以其他方式離開。例如,這可能是return語句或例外。即使發生異常,也能保證資源將被關閉。

您可以將它實現了IDisposable接口的任何對象上using聲明。

// Writing to the files 
using (var sw1 = new StreamWriter("DataNames.txt")) { 
    sw1.WriteLine(textBox1.Text); 
} 
using(var sw2 = new StreamWriter("DataNumbers.txt")) { 
    sw2.WriteLine(textBox2.Text); 
} 

// Reading from the files 
FileInfo file1 = new FileInfo("DataNames.txt"); 
using (StreamReader sr1 = file1.OpenText()) { 
    while (!sr1.EndOfStream) { 
     listBox1.Items.Add(sr1.ReadLine()); 
    } 
} 
FileInfo file2 = new FileInfo("DataNumbers.txt"); 
using (StreamReader sr2 = file2.OpenText()) { 
    while (!sr2.EndOfStream) 
    { 
     listBox2.Items.Add(sr2.ReadLine()); 
    } 
} 

但是,您可以簡化這樣

// Reading from the files 
listBox1.Items.AddRange(File.ReadAllLines("DataNames.txt")); 
listBox2.Items.AddRange(File.ReadAllLines("DataNumbers.txt")); 
+0

+1來理解'using'語句的某些可理解的信息時,不需要使用While循環。我只是缺少一些關於像''ReadLines''這樣的'File'方法的文字(http://msdn.microsoft.com/zh-cn/library/dd383503.aspx)。 –

+0

Yeas,我添加了閱讀部分的簡化版本。 –