我有两个拉链,我使用zip命令来检查两个拉链之间的区别,
diff -y (unzip -l old.zip | psub) (unzip -l new.zip | psub)
我需要它们完全相同
首先在旧工具中创建,看起来像这样,没关系
Length Date Time Name
--------- ---------- ----- ----
158 02-18-2018 12:26 META/MANI.MF
153 02-18-2018 12:26 META/mt.yaml
3956032 02-18-2018 12:26 ui/data.zip
--------- ------- ---------
3956343 3 files
这是带有新工具的拉链,看起来与众不同
Length Date Time Name
--------- ---------- ----- ----
| 0 02-18-2018 20:37 ./
| 0 02-18-2018 20:37 META/
| 150 02-18-2018 20:37 META/MANI.MF
> 178 02-18-2018 20:37 META/mt.yaml
> 0 02-18-2018 20:37 ui/
> 3980703 02-18-2018 20:37 ui/data.zip
如果我们查看ui文件夹(新工具的zip),你会看到新文件中有两个条目
ui/ ui/data.zip
我只需要在旧工具中使用第二个,文件结构应该相同
构建它的逻辑就像这样
- 在程序过程中我有一个名为`ui'
的文件夹- 我在级别上用Zipit函数(见下面的代码)压缩它,所以我就是这样的 根 - ui - ui.zip
- 然后我删除
ui
因为我只需要拉链,它包含很多拉链过程后不需要的文件- 创建新的空文件夹
ui
os.MkdirAll(path,os.ModePerm)- 移除新
醇>ui
文件夹中的zip文件 - os.Rename(路径+" .zip",路径+" /" +"数据。拉链&#34)
我在这里做错了什么?我需要新的结构将在zip内部完全相同
func Zipit(params ...string) error {
zipfile, err := os.Create(params[1])
if err != nil {
return err
}
defer zipfile.Close()
archive := zip.NewWriter(zipfile)
defer archive.Close()
info, err := os.Stat(params[0])
if err != nil {
return nil
}
var baseDir string
if info.IsDir(); len(params) > 2 {
baseDir = params[2]
} else {
baseDir = filepath.Base(params[0])
}
filepath.Walk(params[0], func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
if baseDir != "" {
header.Name = filepath.Join(strings.TrimPrefix(path, params[0]))
}
if info.IsDir() {
header.Name += "/"
} else {
header.Method = zip.Deflate
}
writer, err := archive.CreateHeader(header)
if err != nil {
return err
}
if info.IsDir() {
return nil
}
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(writer, file)
return err
})
return err
}
to see the difference between the zip
答案 0 :(得分:0)
看起来您需要跳过向zip文件头添加目录,每次看到filepath.Walk
回调中的目录时都跳过它:
filepath.Walk(params[0], func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
// I moved this check to the beginning of the callback.
if info.IsDir() {
return nil
}
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
if baseDir != "" {
header.Name = filepath.Join(strings.TrimPrefix(path, params[0]))
}
header.Method = zip.Deflate
writer, err := archive.CreateHeader(header)
if err != nil {
return err
}
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(writer, file)
return err
})