2010-05-27 173 views
4

如何检测文件是二进制还是纯文本?检测文件是二进制还是纯文本?

基本上我的.NET应用程序正在处理批处理文件和提取数据,但我不想处理二进制文件。

作为一种解决方案,我正在考虑分析文件的第一个X字节,如果有比打印字符更多的不可打印字符,它应该是二进制的。

这是正确的做法吗?这项任务有没有更好的实施?

+1

你的方法几乎是我会做到这一点。我会扫描很多\ n的,但同样的想法。 – 2010-05-27 17:20:47

+1

看看http:// stackoverflow。com/questions/567757/how-do-i-distinction-between-binary-and-text-files或者http://stackoverflow.com/questions/277521/how-to-identify-the-file-content-is -in-ascii-or-binary - 这些都是相同的问题,除了不专门用于.NET,我认为大部分你想知道的已经回答了。 – schnaader 2010-05-27 17:22:34

+0

你在做什么样的处理? – 2010-05-27 17:22:50

回答

4

Unix file命令以一种聪明的方式执行此操作。当然,它还有更多的功能,但你可以检查算法here,然后构建一些专门的东西。


UPDATE:上面的链接似乎被打破。尝试this

+1

这是否真的适用于运行在Windows环境中的.Net应用程序? – 2010-05-27 17:47:56

+1

@Moron:是的,因为'file'不使用OS提供的信息来确定文件类型。它只是在查看其他答案中提到的各种BOM,幻数,内容启发式等等。 – 2010-05-27 18:10:36

+0

@Derrick:我的意思是,它是否检测Windows机器上常见的文件,例如在Windows Vista/Windows 7上发现的文件?无论如何,只要将某人指向“文件”的源代码并不是很有用。 – 2010-05-27 18:16:21

0

您可以对第一个X字节数进行正则表达式,如果所有字节都在正确的character class中,则可以给出有效匹配。但这可能预示着你知道编码。

6

你是什么意思的二进制?用中文二进制书写的'战争艺术'是否给你?日英词典怎么样?

没有真正的100%的方法。

你需要使用某种启发式。

某些选项可能是看:

如果以上(特别是文件签名和扩展名)别帮助,然后尝试根据某些字节的存在/不存在来猜测(就像你正在做的那样)。

注意:最好首先检查扩展名/签名,因为您只需要读取几个字节/文件元数据,并且与实际读取整个文件相比,这将非常高效。

+1

这就是我问这个问题的原因:) – 2010-05-27 18:36:31

+0

虽然你需要一个签名数据库等,对于我的任务,元数据阅读太多了完全在设计它。 – 2010-05-27 18:37:29

+0

@dr。邪恶。文件扩展名检查不合理?我认为这是文件元数据。无论如何,我想你有足够的信息来处理你的工作:-) – 2010-05-27 19:18:05

0

我认为这样做的最好方法是至多从文件中取出前X个字节(X可以是256,512等),计算不被ASCII文件使用的字符数(ascii代码允许的是:10,13,32-126)。如果你确定脚本是用英文书写的,那么除了所提到的字符外,不能有任何字符。如果您对语言不太确定,那么您最多可以允许Y字符超出集合(如果X是512,我会选择Y是8或10)。

如果这还不够好,可以使用更多的约束条件,例如:根据文件的语法,这些关键字应该存在(例如:对于批处理文件,应该有一些回显,转到,通话,退出等)

相关问题