如何检测文件是二进制还是纯文本?
基本上我的.NET应用程序正在处理批处理文件和提取数据但是我不想处理二进制文件。
作为一种解决方案,我正在考虑分析文件的前X个字节,如果有不可打印的字符而不是可打印的字符,那么它应该是二进制的。
这是正确的方法吗?这项任务有更好的实施吗?
答案 0 :(得分:6)
二进制是什么意思? “战争的艺术”是用中文二进制写的吗?日英词典怎么样?
没有真正的100%方式。
您需要使用某种启发式方法。
可能需要考虑一些选项:
如果以上(特别是文件签名和扩展名)没有帮助,那么尝试根据某些字节的存在/不存在进行猜测(就像你正在做的那样)。
注意:最好首先检查扩展/签名,因为您只需要读取几个字节/文件元数据,与实际读取整个文件相比,这将非常有效。
答案 1 :(得分:4)
答案 2 :(得分:0)
你可以正则表示前X个字节数,如果所有字节都在适当的character class,则给出有效匹配。但这可能预示着你知道编码。
答案 3 :(得分:0)
我认为最好的方法是从文件中获取最多X个字节(X可以是256,512等),计算ASCII文件未使用的字符数(允许使用ascii代码)是:10,13,32-126)。如果您确定该脚本是用英语编写的,那么除了上述集合之外没有任何字符。如果你不确定这种语言,你可能最多允许Y char在集合之外(如果X是512,我会选择Y为8或10)。
如果这还不够好,你可能会使用更多的约束,例如:根据文件的语法,这些关键字应该存在(例如:对于你的批处理文件,应该有一些回声,如果,如果,转到,呼叫,退出等)