可以安全地在二进制文件上调用File.ReadAllText()吗?

时间:2012-06-09 02:24:04

标签: .net regex file text io

我正在编写一个小程序,它遍历目录中的所有文件并搜索子字符串 它基本上是这样的:

s = File.ReadAllText(FileName)
If s.Contains("Find this substring") Then
    MatchesFound += 1
End If

我也有这个程序的Regex版本,但仍然使用File.ReadAllText()来读取文件。

我是否应该关注在二进制文件上调用File.ReadAllText()? 我不介意在搜索结果中得到一些误报,但我不希望我的程序崩溃 MSDN文档不会显示因无法读取或解释文件数据而导致的此方法的任何异常。

3 个答案:

答案 0 :(得分:2)

您的程序不会崩溃。如果文件太长,可能会占用大量内存。 ReadAllText在返回给您之前释放文件句柄。因此,您的手柄将得到妥善处理。

您的字符串将只包含二进制文件的文本表示。大多数可能是无效字符。 Framework内部使用unicode作为字符串(UTF16)。

只有您应该关注的是非常大的文件,例如一个4GB的ISO文件。如果您的目录中有大文件,那么您应该制作更好的算法来提高代码效率,而不是盲目地获取ReadAllText。

另外,在阅读之前,您可以检查文件大小;如果它显然是一个纯二进制文件(例如100MB zip文件);你可以跳过它并转到下一步。

答案 1 :(得分:1)

您的代码应该有效。 调用方法ReadAllText返回一个String。因此,即使格式不是好格式,您仍然会以字符串结束。

该方法本身应该为文件相关问题抛出异常;不适用于String格式问题。

我能想到的唯一问题是,如果您尝试打开一个太大而无法放入内存的文件,则会抛出异常。否则,您的代码应该可以正常工作。

答案 2 :(得分:0)

请注意,ReadAllText取决于猜测的文件编码。二进制文件中的字符串可以以任何编码存储,因为二进制文件的标题而无法猜测。另请注意,二进制文件可以以一种使读者无法正确解码字符串的方式存储正确编码的字符串,例如因为UTF-16字符串从文件中的奇数位置开始。如果读者猜测UTF-8编码,那么编码错误的空间甚至可能导致字符串的第一个字符被解码为垃圾。