调用ReadAllText后是否需要关闭文件?

时间:2013-07-16 08:21:18

标签: c# file

我正在做以下事情:

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

这完全没问题。我想问的是,在我读完文件后,我是否需要关闭文件或类似文件。如果是这样,怎么样?

5 个答案:

答案 0 :(得分:21)

不,您不必明确关闭该文件,File.ReadAllText会为您处理。

The documentation非常明确地包含此信息:

  

此方法打开一个文件,读取文件的每一行,然后将每一行添加为字符串的元素。然后关闭文件。
  [...]
  保证文件句柄被此方法关闭,即使引发了异常。

答案 1 :(得分:10)

使用File.ReadAllText时不需要关闭任何内容,因为底层流阅读器会被隐式关闭。

MSDN: File.ReadAllText

  

打开文本文件,读取文件的所有行,然后关闭   文件

以下是.NET 4(ILSpy)中的实现:

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

using语句处理StreamReader(即使出错),也会关闭它。

答案 2 :(得分:6)

我知道这个问题已经回答了,这已经差不多一年了但是对于那些搜索和阅读这个问题的人,我建议你在完成这个问题时关闭一个文件,或者至少做一个像我的回答一样的调查示出。

我不是编程专家,但我最近遇到过这种情况。

我创建了一个WinForms c#程序,并使用File.ReadAllText将文本复制到字符串中。之后我试图直接从文件夹中删除文件,而不是通过程序,但是我收到一个错误,该文件仍在另一个程序中打开。然后我停止运行该程序,并能够删除该文件。

这是我在Visual Studio 2012 Ultimate中的经验。可能应该做一些不同的事情,但那就是它为我做的事情。

当我在同一个文件上使用StreamReader.ReadToEnd然后StreamReader.Close时,我在运行程序时删除文件没有问题。

答案 3 :(得分:3)

您必须仅关闭 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实例(File.ReadAllText 返回不具有IDisposable的字符串)你没有什么可以关闭/处理

答案 4 :(得分:0)

StreamWriter outputFile = new StreamWriter(@"C:\Users\Marc\Desktop\_App\files\Data" + dat1 + ".txt");
outputFile.WriteLine(sb.ToString());
outputFile.Close();

StreamWriter outputFileex = new StreamWriter(@"C:\Users\Marc\Desktop\_App\files\DataEx" + dat1 + ".txt");
outputFileex.WriteLine(sbex.ToString());
outputFileex.Close();

这是我刚刚使用stringbuilder做的一个工作示例:“ sb”。如果我删除其中一个关闭文件,则会生成文件,但该文件显示为空白,没有数据。我必须添加一个附件才能使其正常工作。