nodejs 怎么判断一个文件是文件文件还是二进制文件?
发布于 8 年前 作者 suxiaoxin 9700 次浏览 来自 问答

nodejs 怎么判断一个文件是文件文件还是二进制文件?

17 回复

任何文件都是二进制流吧。

@yjhjstz 不是的,有区分的,好比我们读取文件和写入文件,二进制文件跟文本操作是不一样的

应该是 “文本文件”吧? 这个没有严格的区分。

我理解为你是想区别二进制和文本文件吧。扫描文件的前N个字节,一次都一个char的长度(8位的char),如果有任何字符数值大于127,肯定不是文本文件了。

没区别吧。只不过文本文件字符编码不一样对应的二进制也不一样,一般都是utf-8吧

@suxiaoxin

对的, 文本一定是有编码 encoding 存在的… so 做 encoding detect 应该可以

可以调用shell命令file判断是ASCII文件还是二进制文件

@backsapce 不是很明白,能告诉程序怎么写吗?

@Qquanwei 目前就是这样做的,但还想找个不借助shell的.因为借助shell,不兼容window了

@suxiaoxin 原理是,不管是哪种编码的文本文件,解构成单个的char看,必然是ascii字符组成的,数值肯定是0-127.而二进制文件一定会有超过127的字节存在.基于这种理论,你读取某个文件的开始一段,逐个判断是否有字符超过127,如果有,那么肯定是非文本文件了.当然全部扫描是极端的做法,消耗太大,一般就只扫描一段,至于linux file命令的判断,他做的更多,比如在判断可执行的二进制文件时,他通过扫描特定系统的ABI来区分是你某个平台下的可执行文件.

@backsapce 中文字符ascii超过127了啊

@backsapce 正常文本文件是没有ascii 0的,只有二进制文件有,所以文件内容带有ascii 0的应该就是二进制,误判也比较小,速度快

本人已发布到github,npm,欢迎使用 https://github.com/suxiaoxin/study/blob/master/function.js

回到顶部