2013-07-16 3 views
7

私は次のことをやっている:ReadAllTextを呼び出した後でファイルを閉じる必要がありますか?

if (File.Exists(filePath)) 
{ 
    string base64 = File.ReadAllText(filePath); 
    return new ImageContentDTO 
    { 
     ImageContentGuid = imageContentGuid, 
     Base64Data = base64 
    }; 
} 

これは完全に正常に動作します。私が尋ねたいのは、私がファイルを読み終えた後、ファイルやそれに類似するものを閉じる必要があるかどうかです。そしてもしそうなら、どうですか?

答えて

17

いいえ、明示的にファイルを閉じる必要はありません。File.ReadAllTextがそれを処理します。

The documentationは非常に明示的にこの情報が含まれています

この方法は、ファイルを開き、ファイルの各行を読み込み、その文字列の要素としてそれぞれの行を追加します。その後、ファイルを閉じます。
[...]
例外が発生した場合でも、ファイルハンドルはこのメソッドによって閉じられることが保証されています。

+0

Rightyho。どうもありがとうございました。 – Subby

8

File.ReadAllTextを使用しているときに、アンダーリングストリームリーダーが暗黙的に閉じられているため、何も閉じる必要はありません。

MSDN: File.ReadAllText

、テキストファイルを開き、ファイルのすべての行を読み込み、はその後 ファイルを閉じます。ここで

は、.NET 4(ILSpy)での実装です:

string result; 
using (StreamReader streamReader = new StreamReader(path, encoding)) 
{ 
    result = streamReader.ReadToEnd(); 
} 
return result; 

using文はまた、それを閉じている、(でもエラーに)StreamReaderを配置します。

+0

ありがとうTim。 – Subby

+0

私はReadAllTextとそのウィンドウサービスを使用していますので、最初に200MBのファイルを渡しています。そして、それは同じファイルを渡してからOutofmemoryの例外をスローします。 ReadAllTextの各操作の後にいくつかのメモリを配置する必要がありますか? – Neel

+0

@ CoreDeveloper:まだ文字列への参照を保持しているかどうかによって異なります。あなたはそれで何をしていますか?おそらくあなたはそれを何らかの形で消費して、その変数を 'ReadAllText'の次の結果で上書きするかもしれません。 –

2

あなたは通常を使用しての手段により、例えば、唯一のインスタンスにIDisposableをを閉じる必要があります:あなたのコード(File.ReadAllText を返す文字列にIDisposableをインスタンスを持っていないので、

// StreamReader is IDisposable and should be Closed/Disposed 
    // either explicitly or by using 
    using (StreamReader sr = new StreamReader(filePath)) { 
    String base64 = sr.ReadToEnd(); 
    ... 
    } 

これはIDisposableではありません)あなたは閉じる/廃棄するものがありません

+0

わかりました。戻り値の型に関連してIDisposableを記述する+1。 – Subby

4

私はこの質問が回答されており、これはほぼ1年ですが、この質問を検索して読んでいる人には、ドンそれと一緒にe、または少なくとも私の答えが示すような調査をしてください。

私はプログラミングの専門家ではありませんが、最近この状況に遭遇しました。

私はWinFormsのC#プログラムを作成し、File.ReadAllTextを使ってテキストを文字列にコピーしました。その後、プログラムからではなくフォルダからファイルを直接削除しようとしましたが、ファイルが別のプログラムで開いているというエラーが表示されました。私はその後、プログラムの実行を停止し、ファイルを削除することができました。

これはVisual Studio 2012 Ultimateでの私の経験です。違うことをすることになっているかもしれませんが、それが私のためにしたものです。

同じファイルにStreamReader.ReadToEnd、次にStreamReader.Closeを使用したとき、プログラムの実行中にファイルを削除しても問題ありませんでした。

+0

これは実際にどのように実際の生活の中で動作します。私はこの状況を避けるためにストリームリーダーを使用しなければなりませんでした。 – kemsky

関連する問題