gpt4 book ai didi

go - 创建存档排除基目录

转载 作者:IT王子 更新时间:2023-10-29 02:21:12 26 4
gpt4 key购买 nike

我的目录有很多我需要压缩的文件,我找到了这个 https://github.com/mholt/archiver操作系统我需要的是在归档时排除基本目录,但我没有在文档中找到它

即仅压缩文件夹内的文件而没有父文件夹

我使用的代码如下

err := archiver.Zip.Make(“mydir.zip", []string{path2Dir})

我该怎么做?

如果go中还有其他好的解决方案请告诉我

最佳答案

archiver 库总是将 baseDir 附加到 header 名称。请参阅 zip.go 的第 111 行.我在这里看不到一个选项,可以在不修改的情况下使用这个库来满足您的需求。

这个库在内部使用archive/zip。我已经修改了邮政编码以满足您的要求。希望代码是不言自明的。

package main

import (
"archive/zip"
"fmt"
"os"

"path/filepath"
"strings"
"path"
"io"
)

var compressedFormats = map[string]struct{}{
".7z": {},
".avi": {},
".bz2": {},
".cab": {},
".gif": {},
".gz": {},
".jar": {},
".jpeg": {},
".jpg": {},
".lz": {},
".lzma": {},
".mov": {},
".mp3": {},
".mp4": {},
".mpeg": {},
".mpg": {},
".png": {},
".rar": {},
".tbz2": {},
".tgz": {},
".txz": {},
".xz": {},
".zip": {},
".zipx": {},
}

func Zip(source, ou string) error {
out, err := os.Create(ou)
if err != nil {
return fmt.Errorf("error creating %s: %v", ou, err)
}
defer out.Close()
// Create a new zip archive.
w := zip.NewWriter(out)
sourceInfo, err := os.Stat(source)
if err != nil {
return fmt.Errorf("%s: stat: %v", source, err)
}
defer w.Close()
var baseDir string
if sourceInfo.IsDir() {
baseDir = filepath.Base(source)
}

return filepath.Walk(source, func(fpath string, info os.FileInfo, err error) error {
if baseDir == fpath {
//skip the base diectory
return nil
}
if err != nil {
return fmt.Errorf("walking to %s: %v", fpath, err)
}

header, err := zip.FileInfoHeader(info)
if err != nil {
return fmt.Errorf("%s: getting header: %v", fpath, err)
}

if baseDir != "" {
name, err := filepath.Rel(source, fpath)
if err != nil {
return err
}
header.Name = filepath.ToSlash(name)
}

if info.IsDir() {
header.Name += "/"
header.Method = zip.Store
} else {
ext := strings.ToLower(path.Ext(header.Name))
if _, ok := compressedFormats[ext]; ok {
header.Method = zip.Store
} else {
header.Method = zip.Deflate
}
}

writer, err := w.CreateHeader(header)
if err != nil {
return fmt.Errorf("%s: making header: %v", fpath, err)
}

if info.IsDir() {
return nil
}

if header.Mode().IsRegular() {
file, err := os.Open(fpath)
if err != nil {
return fmt.Errorf("%s: opening: %v", fpath, err)
}
defer file.Close()

_, err = io.CopyN(writer, file, info.Size())
if err != nil && err != io.EOF {
return fmt.Errorf("%s: copying contents: %v", fpath, err)
}
}
return nil
})
}

func main() {
err := Zip("caddy", "result.zip")
if err != nil {
fmt.Println(err.Error())
}
}

关于go - 创建存档排除基目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48852506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com