Heim >Backend-Entwicklung >Golang >Wie extrahiere ich passwortgeschützte ZIP-Dateien in Golang 1.2 ohne native Unterstützung?

Wie extrahiere ich passwortgeschützte ZIP-Dateien in Golang 1.2 ohne native Unterstützung?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-31 01:46:29864Durchsuche

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

Extrahieren passwortgeschützter ZIP-Dateien in Golang 1.2 ohne native Unterstützung

Während das Archiv-/Zip-Paket in Go 1.2 grundlegende ZIP-Funktionalität bietet, Es fehlen Mechanismen zum Umgang mit passwortgeschützten Archiven. Um diese Lücke zu schließen, wird empfohlen, das Paket os/exec zu nutzen und ein externes Tool wie 7-zip für die Extraktion zu verwenden.

Verwenden Sie 7-zip zum Extrahieren passwortgeschützter ZIP-Dateien

7-zip bietet robuste Befehlszeilenfunktionen zum Bearbeiten von Archiven, einschließlich passwortgeschützter ZIP-Dateien. So können Sie dies in Go mit os/exec erreichen:

<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>

Beispielprogramm

Das folgende Go-Programm demonstriert den gesamten Prozess der Erstellung eines passwortgeschützten Programms ZIP-Datei, extrahieren Sie sie mit 7-zip und überprüfen Sie den extrahierten Inhalt:

<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>

Hinweis: Stellen Sie sicher, dass 7-zip auf Ihrem System installiert und im Pfad Ihres Systems für enthalten ist dieser Ansatz zur Arbeit.

Das obige ist der detaillierte Inhalt vonWie extrahiere ich passwortgeschützte ZIP-Dateien in Golang 1.2 ohne native Unterstützung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn