Heim >Backend-Entwicklung >Golang >Wie komprimiere ich ein Verzeichnis in Go, ohne den Stammordner einzubeziehen?

Wie komprimiere ich ein Verzeichnis in Go, ohne den Stammordner einzubeziehen?

Linda Hamilton
Linda HamiltonOriginal
2024-11-25 13:16:14513Durchsuche

How to Zip a Directory in Go Without Including the Root Folder?

Inhalt ohne den Stammordner komprimieren

In Go ist es beim Komprimieren eines Verzeichnisses üblich, den Stammordner als Teil des Archivs einzuschließen . Es gibt jedoch Szenarien, in denen Sie möglicherweise den Stammordner ausschließen möchten, um sicherzustellen, dass nur die Inhalte extrahiert werden.

Um dies zu erreichen, erfordert die von Ihnen bereitgestellte Zipit-Funktion eine kleine Änderung:

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

Im Originalcode fügt die Zeile header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source)) den Basisverzeichnisnamen hinzu (z. B. „dir1“) zum Dateinamen im Archiv. Wenn Sie dies durch den obigen Code ersetzen, wird der Name des Basisverzeichnisses weggelassen.

Wenn Sie also die „.zip“-Datei extrahieren, erhalten Sie den Inhalt ohne den Ordner „dir1“ als Stammverzeichnis Verzeichnis.

// Modified Zipit function
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
    }

    // Remove the base directory name
    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
        }

        // Trim the base directory name from the filename
        header.Name = strings.TrimPrefix(path, source)
        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
}

Wenn Sie nun Zipit aufrufen mit:

Zipit("dir1/", "dir1.zip")

Die resultierende „.zip“-Datei enthält nur den Inhalt von „dir1“ ohne den Ordner „dir1“ als Stammverzeichnis beim Extrahieren.

Das obige ist der detaillierte Inhalt vonWie komprimiere ich ein Verzeichnis in Go, ohne den Stammordner einzubeziehen?. 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