首页 > 后端开发 > Golang > 如何在没有本机支持的情况下在 Golang 1.2 中提取受密码保护的 ZIP 文件?

如何在没有本机支持的情况下在 Golang 1.2 中提取受密码保护的 ZIP 文件?

Mary-Kate Olsen
发布: 2024-10-31 01:46:29
原创
788 人浏览过

How to Extract Password-Protected ZIP Files in Golang 1.2 without Native Support?

在没有本机支持的情况下在 Golang 1.2 中提取受密码保护的 ZIP 文件

虽然 Go 1.2 中的 archive/zip 包提供了基本的 ZIP 功能,它缺乏处理受密码保护的档案的机制。为了填补这一空白,建议的方法是利用 os/exec 包并利用 7-zip 等外部工具来执行提取。

使用 7-zip 提取受密码保护的 ZIP 文件

7-zip 提供强大的命令行功能来操作存档,包括受密码保护的 ZIP 文件。以下是如何在 Go 中使用 os/exec 实现此目的:

<code class="go">import (
    "os/exec"
    "fmt"
)

func extractZipWith7zip(zipPath, extractPath, password string) {
    cmdString := fmt.Sprintf("7za e %s -o%s -p%s", zipPath, extractPath, password)
    cmd := exec.Command("7za", strings.Fields(cmdString)...)
    err := cmd.Run()
    if err != nil {
        panic(err)
    }
}</code>
登录后复制

示例程序

以下 Go 程序演示了创建受密码保护的整个过程ZIP 文件,使用 7-zip 解压,并验证解压的内容:

<code class="go">package main

import (
    "fmt"
    "os"
    "os/exec"
    "path/filepath"
    "strings"
)

var (
    originalText = "Sample file created"
    txtFilename  = "name.txt"
    zipFilename  = "sample.zip"
    zipPassword  = "42"

    dirPath = "./test"
    srcPath = filepath.Join(dirPath, "src")
    extractPath = filepath.Join(dirPath, "extracted")
    txtPath = filepath.Join(srcPath, txtFilename)
    zipPath = filepath.Join(srcPath, zipFilename)
)

func main() {
    fmt.Println("# Setup")
    setupTestDirectory()
    createSampleFile()
    createZipWithPassword()
    fmt.Println("# Extraction of password-protected ZIP...")
    extractZipWithPassword()
    verifyExtractedFile()
    fmt.Println("Done.")
}

func setupTestDirectory() {
    os.RemoveAll(dirPath)
    os.MkdirAll(srcPath, os.ModePerm)
    os.MkdirAll(extractPath, os.ModePerm)
}

func createSampleFile() {
    file, err := os.Create(txtPath)
    if err != nil {
        panic(err)
    }
    defer file.Close()
    _, err = file.WriteString(originalText)
    if err != nil {
        panic(err)
    }
}

func createZipWithPassword() {
    cmdString := fmt.Sprintf("7za a %s %s -p%s", zipPath, txtPath, zipPassword)
    cmd := exec.Command("7za", strings.Fields(cmdString)...)
    err := cmd.Run()
    if err != nil {
        panic(err)
    }
}

func extractZipWithPassword() {
    cmdString := fmt.Sprintf("7za e %s -o%s -p%s", zipPath, extractPath, zipPassword)
    cmd := exec.Command("7za", strings.Fields(cmdString)...)
    err := cmd.Run()
    if err != nil {
        panic(err)
    }
}

func verifyExtractedFile() {
    extractedPath := filepath.Join(extractPath, txtFilename)
    content, err := os.ReadFile(extractedPath)
    if err != nil {
        panic(err)
    }
    if string(content) != originalText {
        panic("Extracted content mismatch")
    }
}</code>
登录后复制

注意: 确保 7-zip 已安装在您的系统上并包含在系统的路径中这种工作方式。

以上是如何在没有本机支持的情况下在 Golang 1.2 中提取受密码保护的 ZIP 文件?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板