”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何使用 zip 包轻松解压 Go 中的文件?

如何使用 zip 包轻松解压 Go 中的文件?

发布于2024-11-17
浏览:364

How to Easily Unzip Files in Go with the `zip` Package?

使用 Go 轻松解压

使用 zip 包,在 Go 中解压文件变得轻而易举。它的简单性允许您创建如下所示的实用函数:

func Unzip(src, dest string) error {
    r, err := zip.OpenReader(src)
    if err != nil {
        return err
    }
    defer func() {
        if err := r.Close(); err != nil {
            panic(err)
        }
    }()

    os.MkdirAll(dest, 0755)

    // Closure isolates file descriptor .Close() calls
    extractAndWriteFile := func(f *zip.File) error {
        rc, err := f.Open()
        if err != nil {
            return err
        }
        defer func() {
            if err := rc.Close(); err != nil {
                panic(err)
            }
        }()

        path := filepath.Join(dest, f.Name)

        // Prevent ZipSlip vulnerability
        if !strings.HasPrefix(path, filepath.Clean(dest) string(os.PathSeparator)) {
            return fmt.Errorf("illegal file path: %s", path)
        }

        if f.FileInfo().IsDir() {
            os.MkdirAll(path, f.Mode())
        } else {
            os.MkdirAll(filepath.Dir(path), f.Mode())
            f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
            if err != nil {
                return err
            }
            defer func() {
                if err := f.Close(); err != nil {
                    panic(err)
                }
            }()

            _, err = io.Copy(f, rc)
            if err != nil {
                return err
            }
        }
        return nil
    }

    for _, f := range r.File {
        err := extractAndWriteFile(f)
        if err != nil {
            return err
        }
    }

    return nil
}

此代码精心迭代 zip 存档中的每个文件,适当处理目录和常规文件,同时确保文件路径的有效性。请注意,闭包方法消除了不必要的延迟堆栈,增强了封装性,并简化了错误处理。

最新教程 更多>
  • 如何将文本保留在圆角 Div 内?
    如何将文本保留在圆角 Div 内?
    确保文本保留在圆角 Div 内在创建具有引人入胜的视觉元素的网页时,通常会遇到圆角的需求无缝集成文本内容的 div。然而,默认情况下,圆形 div 内的文本往往表现为其容器是方形的,超出了指定的圆形边界。为了解决此问题,存在多种解决方案,每种解决方案都有自己的优点和优势限制:1。 Shape-Out...
    编程 发布于2024-11-17
  • **扩展语法与其余参数:ES2015 中的区别是什么?**
    **扩展语法与其余参数:ES2015 中的区别是什么?**
    扩展语法和剩余参数:揭开 ES2015 中的差异浏览 ES2015 中扩展语法和剩余参数的细微差别可能是一个想法-令人难以置信的努力。在本指南中,我们将剖析它们在 JavaScript 不断发展的格局中的对比角色。理解扩展语法:从一到多扩展语法(用 ' 表示) ...')允许我们将可...
    编程 发布于2024-11-17
  • 为什么我的 Tomcat 服务器显示“所需的几个端口已在使用中”?
    为什么我的 Tomcat 服务器显示“所需的几个端口已在使用中”?
    Tomcat 服务器端口冲突:解决错误“Several Ports required are Already in Use”尝试在 Tomcat 上启动 JSP 程序时Eclipse 中,用户可能会遇到错误,指出 Tomcat 所需的多个端口已在使用中。出现此问题的原因是存在另一个 Tomcat 实...
    编程 发布于2024-11-17
  • 如何在 Java 中确定文件创建日期?
    如何在 Java 中确定文件创建日期?
    在 Java 中确定文件创建日期:揭示文件元数据确定文件的创建日期可能是一条有价值的信息,尤其是组织和管理文件时。 Java 提供了访问此元数据的机制,只要底层文件系统支持即可。Java 中的文件创建日期Java NIO(新输入/输出)提供用于检索文件元数据的选项,包括创建时间。通过利用 Basic...
    编程 发布于2024-11-17
  • 我们如何在 C/C++ 中实现锯齿状数组?
    我们如何在 C/C++ 中实现锯齿状数组?
    理解 C/C 中的交错数组 虽然交错数组的概念(其中行可以具有不同的长度)在标准 C/C 中,有一些技术可以实现类似的功能。尝试在 C/C 中声明交错数组,如下所示:int jagged[][] = { {0,1}, {1,2,3} };编译器会出错,突出显示为除第一个维度之外的所有维度指定边界的要...
    编程 发布于2024-11-17
  • 如何在 Sublime Text 2 中获取用户输入?
    如何在 Sublime Text 2 中获取用户输入?
    Sublime Text 2 中的用户输入用户尝试在 Sublime Text 2 中输入值时遇到困难,特别是在 Python 中使用 input() 或 gets 等函数时红宝石。控制台不提示输入,导致出现 EOFError 之类的错误。该问题是由于 Sublime Text 2 缺乏对控制台输入...
    编程 发布于2024-11-17
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-17
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-11-17
  • 如何执行存储在 MySQL 数据库中的 PHP 代码?
    如何执行存储在 MySQL 数据库中的 PHP 代码?
    执行存储在 MySQL 数据库中的 PHP执行存储在 MySQL 数据库中的 PHP 给 Web 开发带来了独特的挑战。要执行此操作,您可以使用 PHP 中内置的 eval() 函数。eval() 函数eval() 函数计算给定的字符串作为 PHP 代码。它执行解析后的代码,就像直接在脚本中编写一样...
    编程 发布于2024-11-17
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-17
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-17
  • 如何处理 PHP 8.1 中的返回类型冲突?
    如何处理 PHP 8.1 中的返回类型冲突?
    参考:返回类型冲突与 #[\ReturnTypeWillChange] 属性上下文:在 PHP 8.1 中,指定返回类型方法变得更加普遍,导致与现有的冲突实现。问题:当方法的返回类型从兼容类型更改为不兼容类型或未指定时,会出现以下弃用通知:Deprecated: Return type of [Me...
    编程 发布于2024-11-17
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-17
  • 为什么使用“enableReaderMode” API 将 NDEF 记录写入 NFC 标签?
    为什么使用“enableReaderMode” API 将 NDEF 记录写入 NFC 标签?
    如何将 NDEF 记录写入 NFC 标签将 NDEF 记录写入 NFC 标签需要使用 enableReaderMode API,该 API 提供卓越的性能和与基于意图的系统相比的可靠性。通过处理读写过程而不是依赖系统的默认行为,写入失败和卡损坏的风险显着降低。使用enableReaderMode A...
    编程 发布于2024-11-17
  • 以下是一些适合您文章内容的问题式标题:

* Mac OS X 上的 MySQLdb:为什么我收到“未加载库:libmysqlclient.16.dylib”?
* 如何修复“库未加载:l
    以下是一些适合您文章内容的问题式标题: * Mac OS X 上的 MySQLdb:为什么我收到“未加载库:libmysqlclient.16.dylib”? * 如何修复“库未加载:l
    Python:MySQLdb 和“未加载库:libmysqlclient.16.dylib”在尝试开发 Python/Django 应用程序时,您在 Mac OS X 10.6 上安装 MySQL-python 时遇到问题。尽管成功安装 MySQL,但导入 MySQLdb 失败,并显示错误消息“未加...
    编程 发布于2024-11-17

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3