我想将内容中的某些目录压缩为zip文件
例如假设我有这个目录结构
dir1 file1.html file2.go
现在我想将其压缩到dir1.zip哪个正在工作
dir1.zip
当我解压缩它时,我得到了相同的结构…我想将 内容 压缩 到其中 ,当我解压缩它时,提取文件后,我得到的文件里面没有root文件夹dir1
file1.html file2.go
我尝试使用此代码处理路径,但是它不起作用,我在这里错过了什么吗?
我试过了
func Zipit(source, target string) error { zipfile, err := os.Create(target) if err != nil { return err } defer zipfile.Close() archive := zip.NewWriter(zipfile) defer archive.Close() info, err := os.Stat(source) if err != nil { return nil } var baseDir string if info.IsDir() { baseDir = filepath.Base(source) } filepath.Walk(source, func(path string, info os.FileInfo, err error) error { if err != nil { return err } header, err := zip.FileInfoHeader(info) if err != nil { return err } if baseDir != "" { header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source)) } if info.IsDir() { header.Name += "/" } else { header.Method = zip.Deflate } writer, err := archive.CreateHeader(header) if err != nil { return err } if info.IsDir() { return nil } file, err := os.Open(path) if err != nil { return err } defer file.Close() _, err = io.Copy(writer, file) return err }) return err } dir.Zipit("path/dir1" +"/", "test"+".zip")
或者也许GO中有更简单的方法来实现这一目标?
假设您正在按以下方式调用函数:
Zipit("dir1/", "dir1.zip")
您需要做的就是删除baseDir正在添加到存档内文件名的文件。
baseDir
您目前有以下代码:
if baseDir != "" { header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source)) }
baseDir这是dir1。
dir1
只需省略baseDir(但继续修饰前缀):
header.Name = strings.TrimPrefix(path, source)
这与用不同名称解压缩工件非常相似,您需要做的只是header.Name根据需要进行修改。听起来您需要检查各种filepath功能,以了解它们如何为您提供帮助。
header.Name
filepath