0

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

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

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

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

4

3 回答 3

2

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

您的字符串将仅具有二进制文件的文本表示形式。其中大部分可能是无效字符。框架内部使用 unicode 作为字符串 (UTF16)。

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

此外,在阅读之前,您可以检查文件大小;如果很明显它是一个纯二进制文件(例如 100MB zip 文件);您可以跳过它并移至下一个。

于 2012-06-09T02:31:46.690 回答
1

您的代码应该可以工作。调用方法 ReadAllText 返回一个字符串。因此,即使格式不好,最终还是会得到 String。

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

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

于 2012-06-09T02:31:00.383 回答
0

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

于 2012-06-09T06:03:31.737 回答