11

我正在执行以下操作:

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

这工作得很好。我想问的是在我读完文件后是否需要关闭文件或类似的东西。如果是这样,怎么办?

4

5 回答 5

23

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

该文档非常明确地包含此信息:

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

于 2013-07-16T08:22:24.130 回答
10

我知道这个问题已经得到解答,现在已经快一年了,但是对于那些搜索和阅读这个问题的人,我建议你在完成后关闭一个文件,或者至少像我的答案所示进行调查。

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

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

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

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

于 2014-04-29T21:47:05.087 回答
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(即使出错),也将其关闭。

于 2013-07-16T08:23:24.107 回答
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 的字符串),因此您无需关闭/处置

于 2013-07-16T08:34:16.587 回答
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”。如果我删除其中一个关闭文件,则会生成文件,但文件显示为空白且没有数据。我不得不添加关闭以使其正常工作。

于 2020-05-20T23:14:52.357 回答