Maison >développement back-end >Golang >Comment compresser un répertoire dans Go sans inclure le dossier racine ?

Comment compresser un répertoire dans Go sans inclure le dossier racine ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-25 13:16:14588parcourir

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

Compression du contenu sans le dossier racine

Dans Go, lors de la compression d'un répertoire, il est courant d'inclure le dossier racine dans l'archive . Cependant, il existe des scénarios dans lesquels vous souhaiterez peut-être exclure le dossier racine pour garantir que seul le contenu est extrait.

Pour y parvenir, la fonction Zipit que vous avez fournie nécessite une petite modification :

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

Dans le code d'origine, la ligne header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source)) ajoute le nom du répertoire de base (par exemple, "dir1") au nom de fichier dans l'archive. En le remplaçant par le code ci-dessus, le nom du répertoire de base est omis.

Par conséquent, lorsque vous extrayez le fichier ".zip", vous obtiendrez le contenu sans le dossier "dir1" comme racine répertoire.

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

Maintenant, lorsque vous appelez Zipit en utilisant :

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

Le fichier ".zip" résultant contiendra uniquement le contenu de "dir1" sans le dossier "dir1" comme répertoire racine lors de l'extraction.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn