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)
n, err := f.Read(buf)
if err != nil {
return false, err
}
if n < 4 {
return false, nil
}
return bytes.Equal(buf, []byte("PK\x03\x04"))
}
3.go-huge-util
为了方便大家使用,以上相关代码已开源至 Github 工具库 go-huge-util,大家可使用 go mod 方式 import 然后使用。
import (
"github.com/dablelv/go-huge-util/zip"
)
func main() {
fmt.Println(zip.IsZipFile("a.zip"))
fmt.Println(zip.IsZipFile("a.txt"))
fmt.Println(zip.IsZipFile("b.txt"))
}
其中 a.zip 为事先准备好的 ZIP 文件,a.txt 为文本文件,b.txt 不存在。
运行输出:
true <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
相关文章
- Git简介
- Linux 防火墙遇到的问题
- Docker Gitlib创建项目后仓库连接IP地址不一致问题(包括进入docker中容器命令及退出命令)
- centos6.5linux安装docker之升级内核
- Linux常用指令指南,终端装逼利器
- 第 15 篇:优化博客功能的细节,提升使用体验—— HelloDjango 系列教程
- 第 14 篇:交流的桥梁“评论功能”——HelloDjango 系列教程
- HelloDjango 第 13 篇:分类、归档和标签页
- Python 命令行之旅:使用 argparse 实现 git 命令
- HelloDjango 第 12 篇:解锁博客侧栏,GoGoGo!
- HelloDjango 第 11 篇:自动生成文章摘要
- 《HelloGitHub》第 41 期
- HelloDjango 第 10 篇:小细节 Markdown 文章自动生成目录,提升阅读体验
- HelloDjango 第 09 篇:让博客支持 Markdown 语法和代码高亮
- HelloDjango 第 08 篇:开发博客文章详情页
- HelloDjango 第 07 篇:创作后台开启,请开始你的表演!
- HelloDjango 第 06 篇:博客从“裸奔”到“有皮肤”
- HelloDjango 第 05 篇:Django 的接客之道
- HelloDjango 第 04 篇:Django 迁移、操作数据库
- HelloDjango 第 03 篇:创建 Django 博客的数据库模型