Golang 判断是否 zip 文件

1.压缩文件格式

压缩文件格式多如牛毛,但常见的有 4 种。

ZIP

ZIP 是一个历史悠久的压缩格式,也是事实上的压缩文件格式标准。

ZIP 是一个开放的压缩文件格式,所有任何压缩软件都可以创建 ZIP 文件。

ZIP 由 Phil Katz 于 1989 年设计,所以在文件头中我们可以看到 PK 的字样,这就是 Phil Katz 大名的首字母缩写。

GZ

GZ 名为 GNU ZIP,是一种类 UNIX 平台流行的压缩文件格式。

GZ 由 gzip 软件实现。gzip 是由 Jean-loup Gailly 和 Mark Adler 开发并于 1992 发布的一个自由软件,起初目的是用于取代 UNIX 系统上的压缩软件,并被 GNU 使用。

GZ 一般和 tar 配合使用,先将文件打包后再将其压缩。

RAR

RAR 是一种专利压缩文件格式,用于数据压缩与归档打包。

RAR 由俄罗斯人 Eugene Roshal 于 1993 年设计。RAR 的全称为 “Roshal ARchive”,中文意为“罗谢尔的归档”。

RAR 相比于 ZIP 有着更高的压缩比,但也存在着压缩和解压速度较慢的特点。

7Z

7Z 是一种压缩文件格式,支持多种不同的数据压缩、加密和预处理算法。

7Z 格式最初是由 7-Zip 软件实现。7-Zip 由 Igor Pavlov 开发并于 1999 年基于 GNU LGPL 协议免费开源发布。

7Z 不仅比 ZIP 压缩比高,而且相对于 RAR,占用更少的系统资源。

2.判断是否 ZIP 文件

判断一个文件是否是 ZIP 文件,可以根据 ZIP 开头的特殊表示来判断。

ZIP 文件开头的四个字节为文件头的签名 0x50 0x4b 0x03 0x04。其中 0x504b 即 PK,让我们永远记住 ZIP 之父 Phil Katz。

// IsZipFile reports file whether is a zip file.
func IsZipFile(filepath string) (bool, error) {
	f, err := os.Open(filepath)
	if err != nil {
		return false, err
	}
	defer f.Close()

	buf := make([]byte, 4)
	_, err = f.Read(buf)
	if err == io.EOF {
		return false, nil
	}
	if err != nil {
		return false, err
	}
	return bytes.Equal(buf, []byte("PK\x03\x04")), nil
}

3.dablelv/cyan

为了方便大家使用,以上相关代码已开源至 Github 工具库 dablelv/cyan,大家可使用 go mod 方式 import 后使用。

import (
    "github.com/dablelv/cyan/zip"
)

func main() {
	fmt.Println(zip.IsZipFile("a.zip"))
	fmt.Println(zip.IsZipFile("a.txt"))
	fmt.Println(zip.IsZipFile("nil.txt"))
	fmt.Println(zip.IsZipFile("b.txt"))
}

其中 a.zip 为事先准备好的 ZIP 文件,a.txt 为文本文件,nil.txt 为空的文本文件,b.txt 不存在。

运行输出:

true <nil>
false <nil>
false <nil>
false open b.txt: The system cannot find the file specified.

参考文献

ZIP (file format) - Wikipedia
Phil Katz - Wikipedia
RAR (file format) - Wikipedia
Eugene Roshal - Wikipedia
7z - Wikipedia
7-Zip - Wikipedia
Igor Pavlov - Wikipedia
Gzip - Wikipedia
ZIP - File Format Docs
github.com/dablelv/go-huge-util
How can I determine if a file is a zip file? - Stack Overflow

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值