moyen facile pour décompresser le fichier avec golang
est-il un moyen simple pour décompresser le fichier avec golang ?
droit maintenant, mon code est:
func Unzip(src, dest string) error {
r, err := zip.OpenReader(src)
if err != nil {
return err
}
defer r.Close()
for _, f := range r.File {
rc, err := f.Open()
if err != nil {
return err
}
defer rc.Close()
path := filepath.Join(dest, f.Name)
if f.FileInfo().IsDir() {
os.MkdirAll(path, f.Mode())
} else {
f, err := os.OpenFile(
path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
if err != nil {
return err
}
defer f.Close()
_, err = io.Copy(f, rc)
if err != nil {
return err
}
}
}
return nil
}
- Il y a un problème avec votre code ci - dessus-vous reporter à plus tard la fermeture de tous les fichiers dans le
for
boucle jusqu'à ce queExtract
sorties. Cela fonctionnera très bien pour de petits nombres de fichiers, mais si vous aviez 1000s dans le zip puis vous aurez les descripteurs de fichiers. Le facteur le contenu de lafor
boucle à une fonction ou à la fermeture à corriger. - Je crois que vous avez aussi besoin de
os.MkdirAll(dest, 0755)
juste avant ta boucle for.
Vous devez vous connecter pour publier un commentaire.
Légère refonte de l'OP solution pour créer le répertoire contenant
dest
si elle n'existe pas, et pour envelopper le fichier d'extraction/écrit par une fermeture à éliminer empilage dedefer .Close()
appels par @Nick Craig-Bois's commentaire:Remarque: mis à Jour pour inclure Close() erreur de manipulation ainsi (si nous sommes à la recherche pour les meilleures pratiques, peuvent ainsi suivre TOUS d'entre eux).
some/dir/
qui pourrait être créé, et après quesome/dir/file.txt
pourrait être extrait dans ce. Mais les fichiers sont simplement énumérés seuls avec leur chemin d'accès complet (pas d'autre entrée de répertoire). Ce qui a abouti à l'échec, car le répertoire n'a pas été créé avant d'essayer de créer le fichier en. J'ai édité la réponse à résoudre ce problème.if f.FileInfo().IsDir() {
est-il de vérifier si le fichier est un répertoire, et si oui créer les répertoires parents? si oui, pourquoi ne pouvons-nous pas utiliser le code dans le resteos.MkdirAll(filepath.Dir(path), f.Mode())
partie à lui seul pour faire les répertoires parents?Je suis en utilisant
archive/zip
paquet à lire .zip les fichiers et les copier sur le disque local. Ci-dessous est le code source pour décompresser .les fichiers zip pour mes propres besoins.if lastIndex := strings.LastIndex(fpath,string(os.PathSeparator)); lastIndex > -1 {
. D'où vientstrings
viennent?strings.LastIndex(fpath,string(os.PathSeparator))
peut remplacés parfilepath.Dir(fpath)
Je préfère à l'aide de 7zip avec Go, qui vous donnerait quelque chose comme ça.
Mieux exemple de code
Toutefois, si à l'aide de 7zip n'est pas possible, alors essayez celui-ci. Reporter récupérer pour attraper la panique. (Exemple)
J'ai été faire un peu de navigation de google et constaté à plusieurs reprises des gens qui disent qu'il n'y a pas de bibliothèque qui peuvent gérer. Peut-être que j'ai raté un dépôt personnalisée dans ma recherche et si quelqu'un d'autre va le trouver pour nous.
Vous pouvez être en mesure de faire usage de
io.Copy(src, dest)
pour faciliter le processus, mais je ne l'ai pas testé du tout.Par exemple:
Honnêtement, pour moi, votre code a l'air assez sympa et si je devais faire un Extrait de la fonction de moi-même (et le ci-dessus ne fonctionne pas), alors je serais probablement prendre une page de votre livre.
Tout en travaillant sur la requête pour la capture de ZipSlip vulnérabilités Aller sur LGTM.com (dont je suis un développeur), j'ai remarqué un code similaire à la accepté de répondre à plusieurs projets, par exemple rclone.
Comme @woogoo l'a souligné, ce code est vulnérable à ZipSlip, donc je pense que la réponse devrait être mis à jour à quelque chose comme ce qui suit (code d' rclone fix):
il est
Zip Slip Vulnerability
dans le code de @Astockwell , voir: https://snyk.io/research/zip-slip-vulnerability