现在的做法是把文件读进来,逐个解析每一个byte,如果有一个byte<0那么断定这个文件是二进制的,这在纯英文的环境下可以工作,但是如果一个文本包含了中文字符,那么这个文件也会被判断为二进制文件。
我在网上看看到有人也是逐个比较每一个byte,只不过是如果有一个byte=0就判断为二进制文件,这样做有依据吗?
大家有没有什么解决办法?
评论
Ivan Li 2006-12-14   回复
lijiangt 写道
在linux或者unix系统用file命令就可以打印文件的类型,估计是读取文件头部信息,楼主可以去看看file源代码,应该有所收获。

试了一下file命令,果然能分出绝大多数的文件类型,找源码来看过后再发表意见,我判断是否试文本文件的目的是文本比较,在比较两个文件之前先判断是否是文本文件,如果不是就不比较了,判断后缀名能够满足大部分需求,但是维护已知文件后缀总是觉得不是完全之策,比如再unix下有的文件根本没有后缀也是文本文件,这样岂不是就有了漏网之鱼
lixigua 2006-12-14   回复
仅仅判断前两位不够,我检查过各种执行文件,头两行都是:
4D 5A 90 00 03 00 00 00 04  00 00  00 FF FF 00 00 B8 ***
但是如forxmail,EDiary 则是4D 5A 50,这个是有规律的,可仔细探索下。
4D 5A 90是MZ格式,4D 5A 50大家叫他MZP. -----  这个说法针对win有效,对unix,linux无效

别人的贴看到的另一种判断法(我没证实是否有效):
逐字节读取,然后满足以下任何一个条件那么就是二进制文件:
1、所读取字节大于127并且小于160;
2、所读取字节大于等于160并且不成对出现;(注:大于等于160并成对出现的是汉字,其他UNICODE字符集编码格式不是很清楚)
3、所读取字节小于32并且不等于9(TAB)、10(换行) (注: 10 是UNIX格式文本换行)
4、所读取字节小于32并且等于13(回车)但是之后的字节并不是10(换行) (注:13 10 是DOS格式文本换行)



投新手贴的人确实太不厚道。
lixigua 2006-12-14   回复
要检查是否可执行文件/动态连接库,检查头是否: 4D 5A
检查是否JPG,头文件是否:FF D8 FF E0
每种格式的头文件都是固定的,搂住说“二进制”是有问题的,我估计搂住想问的是:如何判断是否可执行文件?
together 2006-12-14   回复
lijiangt 写道
在linux或者unix系统用file命令就可以打印文件的类型,估计是读取文件头部信息,楼主可以去看看file源代码,应该有所收获。

嗯,这个回复是最靠边的,不错。
可不可以这么说,用文本编辑器(如记事本)能正常编辑的,就是文本文件。
qiezi 2006-12-14   回复
together 写道
投新手的19票,差不多是一个资深会员的。
简单一点的通过后缀名就可以判断。再深入一点,可以以文本方式打开文件,存为string,再写入新文件,如果新旧文件的大小一样,应该就是文本文件了。否则就是二进制文件。

你这只能检查出\0字符。
lijiangt 2006-12-13   回复
在linux或者unix系统用file命令就可以打印文件的类型,估计是读取文件头部信息,楼主可以去看看file源代码,应该有所收获。
Ivan Li 2006-12-13   回复
together 写道
投新手的19票,差不多是一个资深会员的。
简单一点的通过后缀名就可以判断。再深入一点,可以以文本方式打开文件,存为string,再写入新文件,如果新旧文件的大小一样,应该就是文本文件了。否则就是二进制文件。

恩,这倒是一个方法,可以不用全读,只读1024字节,然后存成String,写入tmp文件,在判断新旧是否一样大
together 2006-12-13   回复
投新手的19票,差不多是一个资深会员的。
简单一点的通过后缀名就可以判断。再深入一点,可以以文本方式打开文件,存为string,再写入新文件,如果新旧文件的大小一样,应该就是文本文件了。否则就是二进制文件。
Ivan Li 2006-12-13   回复
在英文环境下还是很简单的,判断每个byte的值,如果不是byte的值不是在32-127之间,同时又不是回车或换行的化,就认为它是二进值的就可以,但是如果又英文字符,就很难判断了
netfishx 2006-12-13   回复
还是根据后缀名靠谱,文本文件本质上也是二进制的。

btw:投新手的确实不厚道
xly_971223 2006-12-13   回复
个人认为这个很难 都是二进制数据 如果没有人告诉你是文本或者二进制 那根本无法知道这个二进制数据到底是什么意义?
就像 告诉你01010001 问这是什么意思? 谁也不能准确回答
Ivan Li 2006-12-13   回复
对是文件版本控制,这倒是一个解决的办法,从文件byte读就没办法了吗?
Readonly 2006-12-13   回复
Ivan Li 写道
文件比较,如果是二进制的就不比较了

具体做什么功能的,版本控制系统?
系统给个默认的文本文件后缀名列表,比如txt, xml, jsp等等,不在这个列表上的统一认为二进制,当然用户可以根据实际需求添加修改这个列表。
Ivan Li 2006-12-13   回复
投新手贴的人我觉得不厚道!
Ivan Li 2006-12-13   回复
文件比较,如果是二进制的就不比较了
Readonly 2006-12-13   回复
判断这个干什么用?
发表评论

该博客是同时发布到论坛的,无法评论在论坛已被锁定的帖子

Ivan Li
搜索本博客
最近加入圈子
存档
最新评论