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
Libérer: 2024-11-25 13:16:14
original
567 Les gens l'ont consulté

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)
Copier après la connexion

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
}
Copier après la connexion

Maintenant, lorsque vous appelez Zipit en utilisant :

Zipit("dir1/", "dir1.zip")
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal