根据我的理解,ReadAllLines会打开一个文件,然后返回该文件中的所有行,然后关闭该文件/流。现在我有了这段代码:
try
{
string[] lines = File.ReadAllLines(path);
}
catch(IOException)
{
Console.WriteLine("File doesnt exist in : " + path);
}
我这样做是为了如果path
目录中的文件不存在,则会抛出错误消息。我的问题:这是必要的吗?由于我不知道微软如何实现ReadAllLines(),我真的不知道已经是否在函数实现中内置了try catch ..
但是,我可以“猜测”ReadAllLines()每次完成读取时都会关闭文件流。这就是我没有运行应该包含在finally{}
块中的 cleanup 代码的原因。
有人可以解释/给我确认吗?任何帮助,将不胜感激。如果问题不明确,请告诉我。谢谢。
答案 0 :(得分:3)
我查看了ILSpy中的源代码,它看起来像是执行以下操作:
[SecuritySafeCritical]
public static string[] ReadAllLines(string path)
{
if (path == null)
{
throw new ArgumentNullException("path");
}
if (path.Length == 0)
{
throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
}
return File.InternalReadAllLines(path, Encoding.UTF8);
}
方法InternalReadAllLines:
private static string[] InternalReadAllLines(string path, Encoding encoding)
{
List<string> list = new List<string>();
using (StreamReader streamReader = new StreamReader(path, encoding))
{
string item;
while ((item = streamReader.ReadLine()) != null)
{
list.Add(item);
}
}
return list.ToArray();
}
答案 1 :(得分:2)
阅读File.ReadAllLines()
方法的文档会有所帮助 - 这里列出了可能引发的所有异常 - 包括IOException
和FileNotFoundException
。
答案 2 :(得分:2)
文档here列出了ReadAllLines在各种情况下抛出的一些异常。列出的所有异常都会导致文件没有打开,因此finally
块中的清理代码不是必需的,但您肯定希望捕获在您的上下文中可能发生的任何异常。
答案 3 :(得分:1)
是的,如果没有找到等,它会抛出异常。只需键入File.ReadAllLines,intellisense将显示该方法可能抛出的所有异常。是的,它确实清理了,如果你担心的话,你不需要担心内部流等。
答案 4 :(得分:1)
如果该路径的末尾不存在该文件,或者该文件被锁定等等,那么是,File.ReadAllLines(path)
将抛出异常,您可以假设使用try catch块。
答案 5 :(得分:1)
答案 6 :(得分:1)
您可以查看该方法的msdn文档,其中包括将抛出异常的说明以及在何种情况下:
http://msdn.microsoft.com/en-us/library/s2tte0y1.aspx
异常
ArgumentException的
path是一个零长度字符串,仅包含空格,或包含由InvalidPathChars定义的一个或多个无效字符。
FileNotFoundException异常
找不到路径中指定的文件。