【问题标题】:Create zip file without headers创建没有标题的 zip 文件
【发布时间】:2018-02-19 12:29:28
【问题描述】:

我有两个 zip,我用一个 zip 命令来检查两个 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                       

这是带有 新工具 的 zip,看起来不同

  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

我只需要旧工具中的第二个,文件结构应该相同

构建它的逻辑是这样的

  1. 在程序过程中,我有一个名为“ui”的文件夹
  2. 我在关卡上用函数Zipit(见下面的代码)压缩它,所以我有这样的 根 - 用户界面 - ui.zip
  3. 然后我删除了ui,因为我只需要 zip,它包含许多压缩后不需要的文件
  4. 新建空文件夹uios.MkdirAll(path, os.ModePerm)
  5. Mmove zip 到新的ui 文件夹 - os.Rename(path+".zip", path+"/"+"data.zip")

我在这里做错了什么?我需要新的结构在 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 

【问题讨论】:

    标签: go zip


    【解决方案1】:

    看起来您需要跳过将目录添加到 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
    })
    

    【讨论】:

    • 谢谢,我已经检查过了,我得到了和以前一样的结构,即检查 zip 时ui 文件夹仍然存在,你还有其他想法吗?
    • @Ninawatcher 嗯,你确定吗?刚刚在我的电脑上检查了一下,zip 没有目录(我使用unzip -l 进行了检查)。
    • 您能否提供您使用的所有代码,也许我错过了什么?
    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 2014-07-01
    • 2013-07-10
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多