【发布时间】:2015-01-05 16:35:26
【问题描述】:
我正在使用boost::filesystem 搜索和处理目录中的文件。
但我不想处理每个文件(使用boost::filesystem::is_regular_file() 检查),我只想处理文本文件(或至少忽略二进制文件)。
即使文件没有扩展名,我有没有办法实现这一点?
我非常感谢独立于平台的解决方案。
【问题讨论】:
-
检查每个文件的前 100 个字节左右的非文本字节。每个二进制文件都有一些。或者,只需在处理过程中将其作为检查的一部分,并在遇到二进制字节时放弃文件。
-
@RobertHarvey 是的,许多文本文件也是如此。例如。 Unicode BOM,或者只是 UTF-8 或 ISO-8859 或其他一些编码中的随机非 ASCII 字符。至少你需要一些阈值,比如 90% 的“文本”(
-
嗯,另一种方法是识别每个可能的文件类型不是文本文件。大多数二进制文件和文档格式都有某种魔术字符串或其他签名。就个人而言,我认为将文件识别为文本或其他内容更容易。
-
@Robert Harvey:因为我不关心文件的确切类型(只要它是文本文件),我想我应该按照您的建议查看前几个字节。对于其余的(即如果需要进一步区分),我会假设文件可以通过它们的扩展名来区分。假设所需的文件必须只包含 UTF-8 字符:我怎样才能很好地猜测文件是否是文本文件?