Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengekstrak Fail ZIP Dilindungi Kata Laluan dalam Golang 1.2 tanpa Sokongan Asli?

Bagaimana untuk Mengekstrak Fail ZIP Dilindungi Kata Laluan dalam Golang 1.2 tanpa Sokongan Asli?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-31 01:46:29720semak imbas

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

Mengekstrak Fail ZIP Dilindungi Kata Laluan dalam Golang 1.2 tanpa Sokongan Asli

Walaupun pakej arkib/zip dalam Go 1.2 menyediakan fungsi ZIP asas, ia tidak mempunyai mekanisme untuk mengendalikan arkib yang dilindungi kata laluan. Untuk mengisi jurang ini, pendekatan yang disyorkan ialah memanfaatkan pakej os/exec dan menggunakan alat luaran seperti 7-zip untuk melaksanakan pengekstrakan.

Menggunakan 7-zip untuk Mengekstrak Fail ZIP yang Dilindungi Kata Laluan

7-zip menawarkan keupayaan baris perintah yang mantap untuk memanipulasi arkib, termasuk fail ZIP yang dilindungi kata laluan. Begini cara anda boleh mencapai ini dalam Go menggunakan 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>

Contoh Program

Atur cara Go berikut menunjukkan keseluruhan proses mencipta kata laluan yang dilindungi ZIP fail, mengekstraknya menggunakan 7-zip dan mengesahkan kandungan yang diekstrak:

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

Nota: Pastikan 7-zip dipasang pada sistem anda dan disertakan dalam laluan sistem anda untuk pendekatan ini untuk bekerja.

Atas ialah kandungan terperinci Bagaimana untuk Mengekstrak Fail ZIP Dilindungi Kata Laluan dalam Golang 1.2 tanpa Sokongan Asli?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn