2017-12-31 69 views
1

だから私は学校のプロジェクトのためのWindowsフォームを試してエラーに実行して維持した。なぜStreamReader.Readの周囲でusing(){}を使用すると、後でファイルを削除できますか?

System.IO.IOException('The process cannot access the file 'C:\XXXX\YYYY.txt' because it is being used by another process.'

button_clickイベント経由でファイル(File.Delete(path);)を削除しようとしたとき。

private void updateTxt(){ 
    String tempStore = ""; 
    iDLbl1.Text = "ID:" + id;//iDLbl1 is ID Label 1 
    try 
    { 
     StreamReader Reader = new StreamReader(path); 
     while (!Reader.EndOfStream) 
     { tempStore += Reader.ReadLine() + "\n"; } 
    } 
    catch { noIDLbl.Visible = true; } 
    rTxtBox.Text = tempStore;//rTxtBox is Rich Text Box 
} 

private void updateTxt(){ 
    String tempStore = ""; 
    iDLbl1.Text = "ID:" + id;//iDLbl1 is ID Label 1 
    try 
    { 
     using(StreamReader Reader = new StreamReader(path)) 
     { 
      while (!Reader.EndOfStream) 
      { tempStore += Reader.ReadLine() + "\n"; } 
     } 

    } 
    catch { noIDLbl.Visible = true; } 
    rTxtBox.Text = tempStore;//rTxtBox is Rich Text Box 
} 

に例外がポップアップ停止:

は私から、次の方法を変更したときに、判明しました。 コードは動作しますが、これはまったく何が原因かわかりません...ロジックは私にとってはクリックしないようですので、誰でもこの問題が発生する理由を知っているか、より論理的な解決方法がありますか?ジャストインケースコンストラクタ:第二のコードで

public FindID(String ID) 
{ 
    id = ID; 
    path = @"C:\XXXX\YYYY\"+ID+".txt"; 
    InitializeComponent(); 
    updateTxt(); 
} 
+1

それは削除することができます前に、はい、ニーズを開いているファイルが再び閉鎖されます。あなたが書いたコードは、File.ReadAllText()の代わりには役に立ちません。 –

答えて

6

、あなたがClose() INGかDispose() INGのではありませんので、ごStreamReader、関連付けられているファイルハンドルが何秒、以降でも数分かもしれないStreamReaderガベージコレクタによって収集され、まで開催されます。 (GCを試して制御したり影響を与えたりしないでください。

2番目のアプローチでは

usingスコープ破棄(および閉鎖する)IDisposableを実装するクラスを使用する場合、正しい練習をある範囲(閉鎖}usingマッチング)の終わりにStreamReader。これにより、ファイルに対するハンドルが解放され、削除が可能になります。

using(StreamReader Reader = new StreamReader(path)) // try {StreamReader Reader = ...} 
{ 
    ... 
} <- equivalent to finally {Reader.Dispose();} 

しかし、あなただけのすぐラインからすべての行を実体化したいように見えることから、:使用してブロックもIO例外がある場合は、そのDisposeも呼ばれますのtry/finallyブロックの保証を持っています区切りのテキストファイル、あなたはFile.ReadAllLinesとワンステップでこれを行うことができます - すべてでStreamReaderの必要はありません。すなわち:

var tempStore = string.Join(Environment.NewLine, File.ReadAllLines(path)); 
3

とすぐにあなたのコードブロックは、StreamReaderをが配置されます実行されます。 StreamReaderが破棄されるので、ファイルは現在のプロセスによってロックされません。

最初のコードでは、コードの最後に同じコードを置くことで同じことができます。あなたの最初のアプローチでは

関連する問題