ホームページ >バックエンド開発 >Golang >ネイティブサポートなしでGolang 1.2でパスワードで保護されたZIPファイルを抽出する方法は?

ネイティブサポートなしでGolang 1.2でパスワードで保護されたZIPファイルを抽出する方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-31 01:46:29793ブラウズ

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

ネイティブ サポートなしで Golang 1.2 でパスワードで保護された ZIP ファイルを抽出する

Go 1.2 のアーカイブ/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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。