Golang创建tar包时如何修改打包逻辑避免保留父目录完整路径
具体修改方案
你遇到的问题本质是打包时tar头的Name字段使用了文件的完整绝对路径,只需要将该字段替换为文件相对于源目录的相对路径即可实现需求,具体修改步骤如下:
- 预处理源目录路径
首先在打包函数入口处将传入的源目录转为绝对路径,并统一补齐末尾的路径分隔符,避免前缀匹配错误:
absSourceDir, err := filepath.Abs(sourceDir) if err != nil { return err } // 确保路径末尾带分隔符,避免前缀匹配时误判 absSourceDir = filepath.Clean(absSourceDir) + string(os.PathSeparator)
- 修改遍历文件时的tar头Name赋值逻辑
在filepath.Walk的回调函数中,对每个遍历到的文件/目录路径做前缀裁剪:
err = filepath.Walk(sourceDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } // 获取当前文件的绝对路径 absFilePath, err := filepath.Abs(path) if err != nil { return err } // 裁剪掉源目录前缀,得到相对路径 relPath := strings.TrimPrefix(absFilePath, absSourceDir) // 统一将路径分隔符转为tar标准的正斜杠,兼容Windows环境 relPath = filepath.ToSlash(relPath) // 跳过空路径(对应源目录本身) if relPath == "" { return nil } // 原有生成tar header的逻辑不变,仅将header.Name替换为relPath header, err := tar.FileInfoHeader(info, info.Name()) if err != nil { return err } header.Name = relPath // 后续写入tar包的原有逻辑保持不变 // ... })
修改后,当你传入/home/Documents/project作为源路径时,源目录下的a.txt在tar包中的路径会变为a.txt,源目录下sub/b.txt的路径会变为sub/b.txt,完全去掉了上层父目录结构,同时保留源目录内部的递归层级。
内容的提问来源于stack exchange,提问作者Keval Bhogayata
相关产品推荐
相关产品推荐

