使用SharpZipLib制作tar.gz时添加目录前缀无效,如何正确配置?
解决SharpZipLib制作tar.gz时添加目录前缀的问题
你的问题核心是没有先创建目录条目,且RootPath的用法不符合预期。SharpZipLib的TarArchive.RootPath是用来替换条目路径中的根目录,而非添加前缀;另外直接修改entry.Name时,需要确保目录分隔符是Unix风格的/,并且必须先将目录本身添加到归档中,否则解压工具不会自动创建目录。
修正后的代码如下:
var archiveName = $"bin/{projectVersion}.tar.gz"; using var archiveStream = File.Create(archiveName); using var gzipStream = new GZipOutputStream(archiveStream); using var archive = TarArchive.CreateOutputTarArchive(gzipStream); // 1. 先创建目录条目 var dirEntry = TarEntry.CreateTarEntry(projectVersion + "/"); dirEntry.TarHeader.Mode = 0755; // 设置目录权限,可选但推荐 archive.WriteEntry(dirEntry, false); // 2. 遍历文件并添加前缀 foreach (var path in Directory.GetFileSystemEntries(publishPath)) { var entry = TarEntry.CreateEntryFromFile(path); // 使用Unix风格分隔符,确保路径正确 entry.Name = $"{projectVersion}/{Path.GetFileName(path)}"; archive.WriteEntry(entry, true); }
关键要点:
- 必须手动创建目录条目:tar格式要求归档中存在目录条目,解压工具才会生成对应的目录;如果只有文件条目带路径前缀,部分解压工具可能会忽略前缀直接放置文件。
- 避免依赖
RootPath:RootPath的作用是移除条目路径中的指定根目录(比如原文件在/home/user/publish/foo.exe,设置RootPath = "/home/user/publish"会把条目名变成foo.exe),不是用来添加前缀的,因此这里不需要设置它。 - 强制使用Unix风格分隔符:Windows的
\在tar归档中会被识别为文件名的一部分,必须换成/才能被正确解析为目录层级。
内容的提问来源于stack exchange,提问作者rwallace
相关产品推荐
相关产品推荐

