【问题标题】:Unzip password zip using golang使用golang解压密码zip
【发布时间】:2019-03-13 00:45:52
【问题描述】:

我正在尝试在 golang 中解压缩一个 zip 文件(使用密码)。

    r, err := zip.OpenReader("./path/to/the.zip")
    if err != nil {
        log.Fatal(err)
    }
    defer r.Close()

    for _, f := range r.File {
        if f.IsEncrypted() {
            f.SetPassword("$83?Lu{5nKbXxncjdH/_B)+}C`")
        }
        r, err := f.Open()
        if err != nil {
            log.Fatal(err)
        }

        buf, err := ioutil.ReadAll(r)
        if err != nil {
            log.Fatal(err)
        }
        defer r.Close()

        fmt.Printf("Size of %v: %v byte(s)\n", f.Name, len(buf))
    }

我现在使用存储库https://github.com/yeka/zip 得到以下输出:

Size of cmxxxgapi/: 0 byte(s)
Size of cmxpi/vxxxxxxxx.yml: 326 byte(s)
Size of cmxxxpi/valxxxxxxe.yml: 379 byte(s)
Size of validations_javxxxo_mxxxxxxxon.yml: 722 byte(s)
Size of validations_xxx_mxxxxxxxxo.yml: 4322 byte(s)
Size of validations_xxxxse.yml: 65 byte(s)

如何解压缩所有这些文件并让它们从我的二进制文件中访问。

非常感谢。

附言。我不能使用 exec。

【问题讨论】:

  • 你已经做到了。 buf 包含文件内容。
  • 谢谢@Peter。我有内容,但我不知道如何将其转储到文件中。因为我以后需要能够访问此内容。我正在尝试,但找不到正确的方法。
  • 谢谢,我知道如何阅读文档,但我不知道您的回答对您有什么帮助。我试过了:ioutil.WriteFile("./sentinel/validations/"+f.Name, buf ,os.ModePerm)。但我得到:37mDEBU[0m[0000] cloneValidations - Starting 31mFATA[0m[0000] flate: corrupt input before offset 4
  • 似乎每次我评论你都会改变问题。 ioutil.WriteFile 不会产生以"flate:" 开头的错误消息。我希望来自f.Openioutil.ReadAll 电话,但你的问题表明两者都是成功的。真的不清楚你在这里问什么。

标签: go unzip zipfile


【解决方案1】:

我终于设法解压了 zip 的内容。我没有正确获取所有文件,因为它没有直接区分文件的路径。

我已经通过以下方式解决了:

r, err := zip.OpenReader("./path/to/the.zip")
if err != nil {
    log.Fatal(err)
}
defer r.Close()

for _, f := range r.File {
    if f.IsEncrypted() {
        f.SetPassword("$83?ksdfkjsdKJHJKjdH/_B)+}C`")
    }
    r, err := f.Open()
    if err != nil {
        log.Fatal(err)
    }

    buf, err := ioutil.ReadAll(r)
    if err != nil {
        log.Fatal(err)
    }
    defer r.Close()

    if f.FileInfo().IsDir() {
        // Make Folder
        os.MkdirAll(fpath, os.ModePerm)
    } else {
        ioutil.WriteFile("./sentinel/validations/"+f.Name, buf ,os.ModePerm)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多