【问题标题】:How to unzip a single file?如何解压单个文件?
【发布时间】:2023-06-08 08:46:02
【问题描述】:

我找到了很多关于如何从 .zip 中提取 所有 文件的示例,但我不知道如何在不遍历 .zip 文件中的所有文件的情况下提取单个文件.

是否可以在 Go 中从 .zip 存档中提取单个文件而不遍历 .zip 文件中的所有文件?

例如,如果一个 zip 文件包含:

folder1/file1.txt
folder1/file2.txt
folder1/file3.txt
folder2/file1.txt

如何只提取folder2/file1.txt

【问题讨论】:

  • 是的,有可能。你试过什么?你在哪里卡住了?请包括您的尝试,瞄准minimal reproducible example
  • 我正在使用 ExampleReader 函数并添加了文件名检查,如果文件名与 folder2/file1.txt 匹配,则会中断循环。我需要知道的是如何在没有循环的情况下获取文件句柄。
  • zip.Reader 为您提供存档的内容,文件作为切片。没有通过名称获取文件的辅助方法,您必须使用循环遍历文件。您不需要打开/提取文件,但要按名称查找文件,您必须使用循环。使用循环有什么问题?

标签: go unzip


【解决方案1】:

zip.Reader 为您提供存档的内容,文件作为 slicezip.File)。没有通过名称获取文件的辅助方法,您必须使用循环遍历文件。您不需要打开/提取文件,但要按名称查找文件,您必须使用循环。

例如:

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

for _, f := range r.File {
    if f.Name != "folder2/file1.txt" {
        continue
    }

    // Found it, print its content to terminal:
    rc, err := f.Open()
    if err != nil {
        log.Fatal(err)
    }
    _, err = io.Copy(os.Stdout, rc)
    if err != nil {
        log.Fatal(err)
    }
    rc.Close()
    fmt.Println()
    break
}

【讨论】: