基础:使用go创建一个zip
func base(path string) {
// 创建 zip 文件
zipFile, err := os.Create("test.zip")
if err != nil {
panic(err)
}
defer zipFile.Close()
// 创建一个新的 *Writer 对象
zipWriter := zip.NewWriter(zipFile)
defer zipWriter.Close()
// 创建一个压缩包中的文件
fileWriter, err := zipWriter.Create("这个地方填文件的新名字.jpg")
if err != nil {
panic(err)
}
// 打开要压缩的文件
f, err := os.Open(path)
if err != nil {
panic(err)
}
defer f.Close()
// 将文件内容拷贝到 ZIP 文件中
if _, err := io.Copy(fileWriter, f); err != nil {
panic(err)
}
// zipWriter.Close() 在 defer 中已经处理
println("ZIP 文件创建成功!")
}
这样可以得到一个path的压缩文件,打开如下:
想要得到一个具备层级的压缩文件,如下图:
需要先做的是创建所需的层级。
即,如果想要在压缩文件中呈现:
压缩文件:北京/朝阳区/美食地图.jpg
需要先创建 “北京/朝阳区/” 这个路径,而创建文件夹和创建文件的方式是一样的:
// 创建一个路径
_, err = zipWriter.Create("北京/朝阳区")
if err != nil {
panic(err)
}
合起来就是:
func pathZip(path string) {
// 创建 zip 文件
zipFile, err := os.Create("test.zip")
if err != nil {
panic(err)
}
defer zipFile.Close()
// 创建一个新的 *Writer 对象
zipWriter := zip.NewWriter(zipFile)
defer zipWriter.Close()
// 创建一个路径
_, err = zipWriter.Create("北京/朝阳区")
if err != nil {
panic(err)
}
// 创建一个压缩包中的文件
fileWriter, err := zipWriter.Create("北京/朝阳区/美食地图.jpg")
if err != nil {
panic(err)
}
// 打开要压缩的文件
f, err := os.Open(path)
if err != nil {
panic(err)
}
defer f.Close()
// 将文件内容拷贝到 ZIP 文件中
if _, err := io.Copy(fileWriter, f); err != nil {
panic(err)
}
// zipWriter.Close() 在 defer 中已经处理
println("ZIP 文件创建成功!")
}
注意,顺序不可以颠倒,要先创建路径,然后创建文件,然后再把文件拷贝到压缩包中。
如果要拷贝另一个文件,需要再创建一个文件且拷贝后才可以,不然之前的文件关闭了就无法再复制进去了。
下面这样是不可行的:
// 创建一个压缩包中的文件
fileWriter, err := zipWriter.Create("美食地图.jpg")
if err != nil {
panic(err)
}
// 创建一个压缩包中的文件
fileWriter2, err := zipWriter.Create("美食地图2.jpg")
if err != nil {
panic(err)
}
// 打开要压缩的文件
f, err := os.Open(path)
if err != nil {
panic(err)
}
defer f.Close()
// 将文件内容拷贝到 ZIP 文件中
if _, err := io.Copy(fileWriter, f); err != nil {
panic(err)
}
// 将文件内容拷贝到 ZIP 文件中
if _, err := io.Copy(fileWriter2, f); err != nil {
panic(err)
}
下面这样是可行的:
// 创建一个压缩包中的文件
fileWriter, err := zipWriter.Create("美食地图.jpg")
if err != nil {
panic(err)
}
// 打开要压缩的文件
f, err := os.Open(path)
if err != nil {
panic(err)
}
defer f.Close()
// 将文件内容拷贝到 ZIP 文件中
if _, err := io.Copy(fileWriter, f); err != nil {
panic(err)
}
// 创建一个压缩包中的文件
fileWriter2, err := zipWriter.Create("美食地图2.jpg")
if err != nil {
panic(err)
}
// 将文件内容拷贝到 ZIP 文件中
if _, err := io.Copy(fileWriter2, f); err != nil {
panic(err)
}
成功了: