如何使用"archive/zip"包在 Golang 中压缩符号链接?



我需要压缩/解压缩包含符号链接的文件夹,以一种结构将被保存和符号链接将被写入符号链接的方式。

是否有办法使用Golang package "archive/zip"?或者有其他的方法吗?

我尝试使用这段代码,但是'io.Copy()'复制了目标文件内容,我们'丢失了';符号链接。

archive, err := os.Create("archive.zip")
if err != nil {
panic(err)
}
defer archive.Close()
zipWriter := zip.NewWriter(archive)
localPath := "../testdata/sym"
file, err := os.Open(localPath)
defer file.Close()
if err != nil {
panic(err)
}
w1 , err:= zipWriter.Create("w1")
if _, err = io.Copy(w1, file); err !=nil{
panic(err)
}
zipWriter.Close()

我使用了这个PR: https://github.com/mholt/archiver/pull/92并将符号链接的目标写入写入器

我在Linux和Windows上进行了测试。

archive, err := os.Create("archive.zip")
if err != nil {
panic(err)
}
defer archive.Close()
zipWriter := zip.NewWriter(archive)
defer zipWriter.Close()
localPath := "../testdata/sym"
symlinksTarget = "../a/b.in"
file, err := os.Open(localPath)
defer file.Close()
if err != nil {
panic(err)
}
info, err := os.Lstat(file.Name())
if err != nil {
panic(err)
}
header, err := zip.FileInfoHeader(info)
if err != nil {
panic(err)
}
header.Method = zip.Deflate
writer, err := zipWriter.CreateHeader(header)
if err != nil {
panic(err)
}
// Write symlink's target to writer - file's body for symlinks is the symlink target.
_, err = writer.Write([]byte(filepath.ToSlash(symlinksTarget)))
if err != nil {
panic(err)
}

最新更新