„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie komprimiere ich Ordnerinhalte ohne den Stammordner in Go?

Wie komprimiere ich Ordnerinhalte ohne den Stammordner in Go?

Veröffentlicht am 18.11.2024
Durchsuche:290

How to Zip Folder Content Without the Root Folder in Go?

Zippen von Inhalten innerhalb eines Ordners ohne den Stammordner

Die Anforderung besteht darin, eine ZIP-Datei zu erstellen, die die Dateien in einem Verzeichnis enthält, mit Ausnahme der Verzeichnis selbst als Stammordner beim Extrahieren.

Das bereitgestellte Snippet versucht dies zu erreichen, indem der Header-Name wie folgt festgelegt wird line:

header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source))

Dieser Code fügt jedoch das Basisverzeichnis (z. B. „dir1“) zum hinzu Header-Name, was zu einem Archiv führt, in dem die Dateien innerhalb der Verzeichnisstruktur verschachtelt sind.

Um dieses Problem zu beheben, sollte die Zeile durch ersetzt werden Folgendes:

header.Name = strings.TrimPrefix(path, source)

Dadurch wird das Basisverzeichnis aus dem Header-Namen entfernt und sichergestellt, dass die Dateien ohne die Verzeichnisstruktur extrahiert werden.

Der geänderte Code würde so aussehen:

import (
    "archive/zip"
    "fmt"
    "io"
    "os"
    "path/filepath"
)

func Zipit(source, target string) error {
    zipfile, err := os.Create(target)
    if err != nil {
        return err
    }
    defer zipfile.Close()

    archive := zip.NewWriter(zipfile)
    defer archive.Close()

    info, err := os.Stat(source)
    if err != nil {
        return nil
    }

    filepath.Walk(source, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }

        header, err := zip.FileInfoHeader(info)
        if err != nil {
            return err
        }

        if info.IsDir() {
            header.Name  = "/"
        } else {
            header.Method = zip.Deflate
        }

        writer, err := archive.CreateHeader(header)
        if err != nil {
            return err
        }

        if info.IsDir() {
            return nil
        }

        file, err := os.Open(path)
        if err != nil {
            return err
        }
        defer file.Close()
        _, err = io.Copy(writer, file)
        return err
    })

    return err
}

func main() {
    err := Zipit("path/dir1"  "/", "test" ".zip")
    if err != nil {
        fmt.Println(err)
    }
}

Dieser Code komprimiert effektiv den Inhalt im Verzeichnis „dir1“, ohne das Verzeichnis selbst in die ZIP-Datei aufzunehmen.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3