1、开发环境 :go 1.19.1 windows/amd64
2、问题描述 :windows操作系统下压缩的目录,liunx操作系统下解压,目录名会变成文件名的一部分,windows平台下解压正常(用到archive/zip)
3、相关代码及结果
```
//本地压缩文件
func localZipFile(dst string, src string) (err error) {
// 创建准备写入的文件
fw, err := os.Create(dst)
defer fw.Close()
if err != nil {
return err
}
// 通过 fw 来创建 zip.Write
zw := zip.NewWriter(fw)
defer func() {
// 检测一下是否成功关闭
if err := zw.Close(); err != nil {
fmt.Println("********关闭文件流出错********")
}
}()
// 下面来将文件写入 zw ,因为有可能会有很多个目录及文件,所以递归处理
return filepath.Walk(src, func(path string, fi os.FileInfo, errBack error) (err error) {
if errBack != nil {
return errBack
}
// 通过文件信息,创建 zip 的文件信息
fh, err := zip.FileInfoHeader(fi)
if err != nil {
return
}
// 替换文件信息中的文件名
fh.Name = strings.TrimPrefix(path, string(filepath.Separator))
// fh.Name = strings.TrimPrefix(path, "/")
// 这步开始没有加,会发现解压的时候说它不是个目录(Windows下压缩,解压正常。如果windows下压缩Liunx下解压,则解压后目录名成了文件名字的一部分)
if fi.IsDir() {
fh.Name += string(os.PathSeparator)
// fh.Name += "/"
}
// 写入文件信息,并返回一个 Write 结构
w, err := zw.CreateHeader(fh)
if err != nil {
return
}
// 检测,如果不是标准文件就只写入头信息,不写入文件数据到 w
// 如目录,也没有数据需要写
if !fh.Mode().IsRegular() {
return nil
}
// 打开要压缩的文件
fr, err := os.Open(path)
defer fr.Close()
if err != nil {
return
}
// 将打开的文件 Copy 到 w
_, err = io.Copy(w, fr)
if err != nil {
return
}
// 输出压缩的内容
// fmt.Printf("成功压缩文件: %s, 共写入了 %d 个字符的数据\n", path, n)
return nil
})
}
```
4、实际结果(目录名作为了文件名的一部分。windows下解压正常)
![image.png](https://static.golangjob.cn/230612/ce4d4e811463d2b672635c901e630b7b.png)
5、希望结果
windows下压缩的目录在所有平台下解压,目录结构不变
有疑问加站长微信联系(非本文作者)