Wie komprimiere ich Ordnerinhalte ohne den Stammordner in Go?

Susan Sarandon
Freigeben: 2024-11-18 05:03:02
Original
750 Leute haben es durchsucht

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

Inhalte innerhalb eines Ordners ohne den Stammordner komprimieren

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 es den Headernamen mithilfe der folgenden Zeile festlegt:

header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source))
Nach dem Login kopieren

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

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

header.Name = strings.TrimPrefix(path, source)
Nach dem Login kopieren

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)
    }
}
Nach dem Login kopieren

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

Das obige ist der detaillierte Inhalt vonWie komprimiere ich Ordnerinhalte ohne den Stammordner in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage