我正在执行以下操作:
if (File.Exists(filePath))
{
string base64 = File.ReadAllText(filePath);
return new ImageContentDTO
{
ImageContentGuid = imageContentGuid,
Base64Data = base64
};
}
这工作得很好。我想问的是在我读完文件后是否需要关闭文件或类似的东西。如果是这样,怎么办?
不,您不必明确关闭文件,File.ReadAllText
为您处理。
该文档非常明确地包含此信息:
此方法打开一个文件,读取文件的每一行,然后将每一行添加为字符串的一个元素。然后它关闭文件。
[...]
即使引发异常,也保证通过此方法关闭文件句柄。
我知道这个问题已经得到解答,现在已经快一年了,但是对于那些搜索和阅读这个问题的人,我建议你在完成后关闭一个文件,或者至少像我的答案所示进行调查。
我不是编程专家,但我最近遇到了这种情况。
我创建了一个 WinForms c# 程序并用于File.ReadAllText
将文本复制到字符串。之后我尝试直接从文件夹中删除文件,而不是通过程序,但我得到一个错误,文件仍然在另一个程序中打开。然后我停止运行该程序并能够删除该文件。
这就是我在 Visual Studio 2012 Ultimate 中的体验。它可能应该做一些不同的事情,但这就是它为我所做的。
当我在同一个文件上使用StreamReader.ReadToEnd
thenStreamReader.Close
时,在运行程序时删除文件没有问题。
使用时不需要关闭任何东西,File.ReadAllText
因为底层流阅读器已隐式关闭。
打开一个文本文件,读取文件的所有行,然后关闭文件。
这是 .NET 4 (ILSpy) 中的实现:
string result;
using (StreamReader streamReader = new StreamReader(path, encoding))
{
result = streamReader.ReadToEnd();
}
return result;
该using
语句处理StreamReader
(即使出错),也将其关闭。
您只需关闭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 的字符串),因此您无需关闭/处置
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”。如果我删除其中一个关闭文件,则会生成文件,但文件显示为空白且没有数据。我不得不添加关闭以使其正常工作。