go windows操作系统压缩的目录liunx操作系统下解压,目录名变成文件名的一部分(windows下解压正常)

Liz8202 · · 1681 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

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下压缩的目录在所有平台下解压,目录结构不变

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1681 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传