登录
首页 >  Golang >  Go问答

如何在 Go 中提取 .7z 文件

来源:stackoverflow

时间:2024-04-16 09:00:33 187浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《如何在 Go 中提取 .7z 文件》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我有一个包含许多 .txt 文件的 7z 存档。我正在尝试列出存档中的所有文件并将它们上传到 s3 存储桶。但我在 go 上提取 .7z 档案时遇到了问题。为此,我找到了一个包 github.com/gen2brain/go-unarr (作为提取器导入),这就是我到目前为止所拥有的

content, err := ioutil.readfile("sample_archive.7z")
        if err != nil {
            fmt.printf("err: %+v", err)
        }

        a, err := extractor.newarchivefrommemory(content)
        if err != nil {
            fmt.printf("err: %+v", err)
        }

        lst, _ := a.list()
        fmt.printf("lst: %+v", last)

这将打印存档中所有文件的列表。但这有两个问题。

它使用ioutil从本地读取文件,并且newarchivefrommemory的输入必须是[]byte类型。但我无法从本地读取,并且必须使用 os.file 类型的内存中的文件。因此,我要么必须找到不同的方法,要么将 os.file 转换为 []byte。还有另一个方法 newarchivefromreader(r io.reader)。但这返回一个错误,指出 bad file descriptor

file, err := os.OpenFile(
    path,
    os.O_WRONLY|os.O_TRUNC|os.O_CREATE,
    0666,
)

a, err := extractor.NewArchiveFromReader(file)
if err != nil {
    fmt.Printf("ERROR: %+v", err)
}
    
lst, _ := a.List()
fmt.Printf("files: %+v\n", lst)

我能够获取存档中的文件列表。使用 extract(destinaltion_path string),我还可以将其提取到本地目录。但我希望提取的文件也采用 os.file 格式(即 os.file 列表,因为会有多个文件)。

如何更改当前代码以实现上述两个目标?还有其他库可以做到这一点吗?


正确答案


  1. os.file 实现了 io.reader 接口(因为它定义了 read([]byte) (int, error) 方法),因此您可以使用 newarchivefromreader(file) ,无需任何转换。您可以阅读 Go interfaces,了解有关其工作原理的更多背景信息。
  2. 如果您同意提取到本地目录,则可以执行此操作,然后读回文件(警告,可能包含拼写错误):
func extractAndOpenAll(*extractor.Archive) ([]*os.File, error) {
  err := a.Extract("/tmp/path") // consider using ioutil.TempDir()
  if err != nil {
    return nil, err
  }

  filestats, err := ioutil.ReadDir("/tmp/path")
  if err != nil {
    return nil, err
  }

  # warning: all these file handles must be closed by the caller, 
  # which is why even the error case here returns the list of files.
  # if you forget, your process might leak file handles. 
  files := make([]*os.File, 0)
  for _, fs := range(filestats) {
    file, err := os.Open(fs.Name())
    if err != nil {
      return files, err
    }

    files = append(files, file)
  }

  return files, nil
}

可以使用存档文件而不写回磁盘 (https://github.com/gen2brain/go-unarr#read-all-entries-from-archive),但是否应该这样做取决于下一步是什么。

以上就是《如何在 Go 中提取 .7z 文件》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>