golang判断是否为zip文件(代码片段)

恋喵大鲤鱼 恋喵大鲤鱼     2023-01-06     117

关键词:

文章目录

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.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("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

golang判断文件是否存在(代码片段)

判断一个文件是否存在是一个相当常见的需求,在golang中也有多种方案实现这一功能。现在我们介绍其中两种最常用也是最简单的实现,第一种将是跨平台通用的,而第二种则在POSIX平台上通用。跨平台实现跨平台实现的思路很... 查看详情

golang创建压缩文件(代码片段)

import("os""archive/zip""io""fmt""strings")//ZipFilescompressesoneormanyfilesintoasingleziparchivefile.//压缩多个文件到一个文件里面//Param1:输出的zip文件的名字//Param2:需要添加到zip文件里面的文件//Param3:由于file是绝对路径,打包后可能不是想要的目... 查看详情

如何判断golang接口是否实现?(代码片段)

...乎有了本文。主要探讨两个问题:1.利用编译来判断Golang接口是否实现2.延伸出的make和new的区别正文1.利用编译来判断Golang接口是否实现看了一个底层通用链接池的库,有这么一行代码:var_Pooler=new(WeightedRoundRobin) 查看详情

golang类型判断(代码片段)

_.ok:=interface(a).(B)此语句用于判断对象a是否是B类型也可以判断对象a是否实现了B接口packagemainimport"fmt"typePetinterfaceSetName(namestring)Name()stringCategory()stringtypeDogstructnamestringfunc(dog*Dog)SetName(namestring) 查看详情

flask统计代码行数(代码片段)

流程:  1.获取前端的文件  2.判断文件是否zip文件  3.解压压缩包并保存  4.遍历解压后的文件夹  5.判断文件是否py文件,将绝对路径添加到列表  6.循环列表,排除注释和空号,统计行数fromflaskimportBlueprintfromflaski... 查看详情

golang中如何判断文件是否有可执行权限

本文介绍在Go语言如何检查文件的权限。以检查文件可执行权限为例。在文件系统中,文件的属性使用uint32表示。例如-rwxrwxrwx判断可执行权限,也就是检查文件mode是否有:--x--x--x表示成十进制数就是73.具体代码如下packagemainimport("... 查看详情

go判断元素是否在切片中(代码片段)

...2.遍历查询3.map查询4.性能对比5.转换通用化6.借助开源库golang-set7.小结参考文献1.问题如何判断元素是否在切片中,Golang并没有提供直接的库函数来判断,最容易想到的实现便是通过遍历来判断。2.遍历查询以字符串切片为... 查看详情

go判断元素是否在切片中(代码片段)

...2.遍历查询3.map查询4.性能对比5.转换通用化6.借助开源库golang-set7.小结参考文献1.问题如何判断元素是否在切片中,Golang并没有提供直接的库函数来判断,最容易想到的实现便是通过遍历来判断。2.遍历查询以字符串切片为... 查看详情

006-条件判断(代码片段)

条件判断-d:判断文件是否存在并是否为目录-e:判断文件是否存在-f:判断文件是否存在并是否为普通文件文件1-nt文件2:判断文件1是否比文件2新文件1-ot文件2:判断文件1是否比文件2旧文件1-ef文件2:判断文件1和文件2inode号是否... 查看详情

golang检查golang中是否存在文件或目录(代码片段)

查看详情

golang检查golang中是否存在文件或目录(代码片段)

查看详情

golang学习记录:二进制文件判断实现与思路(代码片段)

...录一、前言二、思路三、实现一、前言  最近在写一个golang实现的字符串搜索与替换程序练手,其中一个很大的问题就是程序不能识别二进制文件与文本文件,导致搜索出来的内容会乱码,非常的不雅观。如果再不... 查看详情

golang学习记录:二进制文件判断实现与思路(代码片段)

...录一、前言二、思路三、实现一、前言  最近在写一个golang实现的字符串搜索与替换程序练手,其中一个很大的问题就是程序不能识别二进制文件与文本文件,导致搜索出来的内容会乱码,非常的不雅观。如果再不... 查看详情

shell脚本——文件是否存在权限校验(代码片段)

文章目录判断目录是否存在判断文件是否存在判断目录/文件是否存在判断文件权限判断文件是否属于当前用户判断文件是否与当前用户相同用户组比较文件之间是否为新建复合条件判断文件判断目录是否存在#判断目录是否存在&... 查看详情

shell脚本——文件是否存在权限校验(代码片段)

文章目录判断目录是否存在判断文件是否存在判断目录/文件是否存在判断文件权限判断文件是否属于当前用户判断文件是否与当前用户相同用户组比较文件之间是否为新建复合条件判断文件判断目录是否存在#判断目录是否存在&... 查看详情

golang用于确定go中的数字是否为素数的函数。(代码片段)

查看详情

字符串函数在golang中的使用(代码片段)

packagemainimport("fmt""strings")funcmain()//判断父字符串是否包含子字符串,包含为真,否则为假fmt.Println("-------------------------------")fmt.Println("containsFunction:",strings.Contains("Austrilia","lia"))fmt.Println("containsFunction:",strings.Contains("Austrilia","mia"))/... 查看详情

python创建目录判断路径是否为目录打开文件夹操作(代码片段)

1.Python创建目录#导入os模块importos#判断一个目录path是否存在os.path.exists(path)#创建目录pathos.mkdir(path)#多层创建目录pathos.makedirs(path)importospath='E:/test/'ifos.path.exists(path):passelse:os.mkdir(path)2.判断路径 查看详情