go语言中判断某个文件是否是二进制文件的方法, 通过LimitReader读取指定大小的数据后对数据进行判断, 这里有一个很有趣的知识点就是 字符串0在写入文件后,再通过io read读取后的byte数据他在内存中显示的可不是0 而是变成了 48, 十六进制 0x30。
判断某个文件内容是否二进制示例函数
// IsBinaryFile 是否二进制文件(且存在)
// fname 要判断的文件名 包含路径
// 是二进制文件 返回 true , 否则返回false
// @author tekintian <tekintian@gmail.com>
func IsBinaryFile(fname string) bool {
f, err := os.Open(fname)
if err != nil {
return false
}
var maxR int64
// 通过文件统计信息 获取文件大小
if fi, err := f.Stat(); err == nil {
maxR = fi.Size()
}
if maxR == 0 { // 如果文件内容为空,字节返回false
return false
}
if maxR > 32 { // 最多读取32个字节 判断是否binary应该是足够了
maxR = 32
}
// 只读取指定大小的数据 LimitReader
reader := io.LimitReader(f, maxR)
fbs := make([]byte, maxR)
if _, err := reader.Read(fbs); err != nil {
return false
}
for _, v := range fbs {
// 读取的字节切片中如果有 v==0 说明这个文件是二进制文件. 注意字符串0的byte是48 十六进制 0x30 !!!
if v == 0 {
return true
}
}
return false
}
测试用例
package myfile_test
import (
"gotms/utils/myfile"
"testing"
)
func makeBinaryFile() {
// 写入一个测试文件
myfile.WriteFile("test.bin", []byte("000 hello world 123"))
}
func TestIsBinaryFile(t *testing.T) {
makeBinaryFile()
ret := myfile.IsBinaryFile("test.bin")
if !ret {
t.Fatal("Failed to test binary")
}
}
[]byte零值
byte切片的零值内存中是0, 字符串表现形式是 \x00, 因此我们在定义用于读取文件内容的[]byte时是不能超过文件大小的,否则判断就不准确了!