我想将内容中的一些目录压缩到zip文件
e.g。假设我有这个目录结构
dir1
file1.html
file2.go
现在我想将其压缩到dir1.zip
正在运行的
当我提取它时,我得到了相同的结构...... 我想压缩内容,当我解压缩它时,我得到的文件里面没有`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中有更简单的方法来实现这个目标?
答案 0 :(得分:1)
假设您按以下方式调用您的函数:
Zipit("dir1/", "dir1.zip")
您需要做的就是删除正在添加到存档内文件名的baseDir
。
您目前拥有以下代码:
if baseDir != "" {
header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source))
}
baseDir
这里是dir1
。
只需省略baseDir
(但要继续修剪前缀):
header.Name = strings.TrimPrefix(path, source)
这与Unzip artifacts with different name非常相似,您需要做的就是根据需要修改header.Name
。听起来你需要检查各种filepath
函数,看看它们如何帮助你。