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

C# 调用ReadAllText后是否需要关闭文件?,c#,file,C#,File,我正在做以下工作: if (File.Exists(filePath)) { string base64 = File.ReadAllText(filePath); return new ImageContentDTO { ImageContentGuid = imageContentGuid, Base64Data = base64 }; } 这个很好用。我想问的是,在我阅读完文件后,是否需要关闭该文件或任何类似文件。如果是这样,怎么做?不,您

我正在做以下工作:

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

这个很好用。我想问的是,在我阅读完文件后,是否需要关闭该文件或任何类似文件。如果是这样,怎么做?

不,您不必显式关闭文件,
file.ReadAllText
会为您解决这个问题

非常明确地包含以下信息:

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


使用
File.ReadAllText
时,不需要关闭任何内容,因为下面的流读取器是隐式关闭的

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

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

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

您必须仅关闭IDisposable实例,通常通过使用,例如:

因为代码中没有IDisposable实例(File.ReadAllText
返回不可识别的字符串)您没有任何要关闭/处置的内容

我知道这个问题已经得到了回答,现在已经快一年了,但对于搜索和阅读此问题的人,我建议您在处理完文件后关闭它,或者至少像我的回答那样进行调查

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

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

这是我在VisualStudio2012 Ultimate的体验。它可能会做一些不同的事情,但这就是它为我做的

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

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”。如果我删除其中一个“关闭”,则会生成文件,但该文件显示为空白,没有数据。我必须加上一个关闭按钮才能让它正常工作。

Rightyho。非常感谢。非常感谢Tim。我使用了ReadAllText,它是一个窗口服务,所以我第一次传递200MB文件时,它工作正常,然后再次传递相同的文件,然后抛出内存异常。每次操作ReadAllText后是否需要释放一些内存?@CoreDeveloper:取决于您是否仍保留对字符串的引用。你拿它干什么?也许您可以以某种方式使用它,然后用下一个结果
ReadAllText
覆盖变量。每次新文件出现之前,我都会将字符串设置为空。@CoreDeveloper:也许您可以将其设置为一个真正的问题,然后我们可以尝试提供帮助。啊,我明白了+1用于提及与返回类型相关的IDisposable。这实际上是它在现实生活中的工作方式。我不得不使用流阅读器来避免这种情况。谢谢。。。我现在也面临同样的问题。。。。。我天真地认为ReadAllText实际上会关闭该文件,但在某些情况下,该文件仍然处于打开状态。问题是如何从文件中读取。您的帖子是关于写入文件的,因此这与此无关。在您的情况下,close首先调用Flush(),这会清空内存缓冲区并将其物理写入文件。这就是您在文件中获取内容的原因。
  // StreamReader is IDisposable and should be Closed/Disposed 
  // either explicitly or by using  
  using (StreamReader sr = new StreamReader(filePath)) {
    String base64 = sr.ReadToEnd();
    ...
  }
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();