File.ReadAllBytes 代码重构

3
我今天遇到了这段代码:
public static byte[] ReadContentFromFile(String filePath)
{
    FileInfo fi = new FileInfo(filePath);
    long numBytes = fi.Length;
    byte[] buffer = null;
    if (numBytes > 0)
    {
        try
        {
            FileStream fs = new FileStream(filePath, FileMode.Open);
            BinaryReader br = new BinaryReader(fs);
            buffer = br.ReadBytes((int)numBytes);
            br.Close();
            fs.Close();
        }
        catch (Exception e)
        {
            System.Console.WriteLine(e.StackTrace);
        }
    }
    return buffer;
}

我的第一个想法是将其重构为以下内容:

public static byte[] ReadContentFromFile(String filePath)
{
    return File.ReadAllBytes(filePath);
}

System.IO.File.ReadAllBytes的文档说明如下:

打开二进制文件,读取文件内容到一个字节数组中,然后关闭文件。

但是我是否错过了一些关键的差异?

3个回答

7
原始代码在文件为空时返回一个空引用,并且如果无法读取该文件,则不会抛出异常。个人认为最好返回一个空数组,并且不要吞咽异常,但我觉得这就是重构和重新设计之间的区别。
另外,如果在获取长度和读取文件之间改变了文件长度,则原始代码将读取原始长度。同样,我认为File.ReadAllBytes的行为更好。
如果文件不存在,您想要发生什么?

2

如果添加try {...} catch{...}块,那基本上是相同的方法。而方法名ReadContentFromFile更进一步证明了这一点。

等一下...这不是单元测试应该告诉我们的内容吗?


1
在这种情况下,你没有漏掉任何东西,从文件操作的角度来看。现在你知道了你缺乏异常处理会改变系统的行为。
这是一种简化的读取文件字节的方式。
注意:如果你需要在读取时设置任何自定义选项,那么你需要使用长格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接