N'utilisez pas la solution suggérée dans la réponse acceptée mais celle plus bas en utilisant make_archivefrom shutil(si vous voulez compresser un seul répertoire récursivement).
malana
Réponses:
527
Comme d'autres l'ont souligné, vous devez utiliser un fichier zip . La documentation vous indique quelles fonctions sont disponibles, mais n'explique pas vraiment comment vous pouvez les utiliser pour compresser un répertoire entier. Je pense qu'il est plus facile d'expliquer avec un exemple de code:
#!/usr/bin/env pythonimport os
import zipfile
def zipdir(path, ziph):# ziph is zipfile handlefor root, dirs, files in os.walk(path):for file in files:
ziph.write(os.path.join(root, file))if __name__ =='__main__':
zipf = zipfile.ZipFile('Python.zip','w', zipfile.ZIP_DEFLATED)
zipdir('tmp/', zipf)
zipf.close()
J'ajouterais un deuxième argument à l'appel d'écriture, en passant os.path.relpath(os.path.join(root, file), os.path.join(path, '..')). Cela vous permettrait de compresser un répertoire à partir de n'importe quel répertoire de travail, sans obtenir les chemins absolus complets dans l'archive.
Reimund
8
Il y a une récursion amusante quand j'essaie de compresser un dossier et de sortir le zip résultant dans le même dossier. :-)
Sibbs Gambling
13
shutille rend vraiment facile en une seule ligne. Veuillez vérifier la réponse ci-dessous ..
droidlabour
7
vous pouvez être plus intéressé par faire ziph.write (os.path.join (chemin, fichier), arcname = fichier) afin que les noms de fichiers à l'intérieur de l'archive ne soient pas relatifs au disque dur
Christophe Blin
1
Ah, l' .close()appel me manquait !
information_interchange
1066
La façon la plus simple est d'utiliser shutil.make_archive. Il prend en charge les formats zip et tar.
Si vous devez faire quelque chose de plus compliqué que de zipper tout le répertoire (comme sauter certains fichiers), alors vous devrez creuser dans le zipfilemodule comme d'autres l'ont suggéré.
shutilfait partie de la bibliothèque Python standard. Cela devrait être la meilleure réponse
AlexG
4
C'est la réponse la plus concise ici et a également l'avantage d'ajouter directement tous les sous-répertoires et fichiers à l'archive, plutôt que de tout inclure dans un dossier de niveau supérieur (ce qui entraîne un niveau redondant dans la structure de dossiers lors de la décompression).
aitch-hat
3
@cmcginty pourriez-vous s'il vous plaît être un peu plus précis quant à quel aspect de celui-ci n'est pas thread-safe? Est-ce que l'exécution de plusieurs threads pendant que l'on appelle cela provoquera le crash de l'interpréteur?
std''OrgnlDave
13
Soyez averti qu'avant Python 3.4, shutil.make_archive ne prend pas en charge ZIP64 et échouera lors de la création de fichiers ZIP supérieurs à 2 Go.
azdev
2
@Teekin No. Si vous regardez le rapport de bugs (bugs.python.org/issue30511), vous verrez que cela shutil.make_archivesert os.chdir(). D'après ce que je lis os.chdir(), il fonctionne à l'échelle mondiale.
Sam Malayek
65
Pour ajouter le contenu de mydirectoryà un nouveau fichier zip, y compris tous les fichiers et sous-répertoires:
import os
import zipfile
zf = zipfile.ZipFile("myzipfile.zip","w")for dirname, subdirs, files in os.walk("mydirectory"):
zf.write(dirname)for filename in files:
zf.write(os.path.join(dirname, filename))
zf.close()
Pour moi, ce code lançant ci-dessous l'erreur TypeError: fichier non valide: <zipfile.ZipFile [fermé]>
Nishad Up
10
Ne pouvez-vous pas utiliser un withau lieu de devoir close()vous appeler à la fin?
ArtOfWarfare
50
Comment puis-je créer une archive zip d'une structure de répertoires en Python?
Dans un script Python
En Python 2.7+, shutila une make_archivefonction.
from shutil import make_archive
make_archive('zipfile_name','zip',# the archive format - or tar, bztar, gztar
root_dir=None,# root for archive - current working dir if None
base_dir=None)# start archiving from here - cwd if None too
Ici, l'archive zippée sera nommée zipfile_name.zip. Si base_direst plus bas, root_diril exclura les fichiers qui ne se trouvent pas dans le base_dir, mais archivera toujours les fichiers dans les répertoires parents jusqu'auroot_dir .
J'ai eu un problème en testant cela sur Cygwin avec 2.7 - il veut un argument root_dir, pour cwd:
make_archive('zipfile_name','zip', root_dir='.')
Utiliser Python à partir du shell
Vous pouvez le faire avec Python à partir du shell en utilisant également le zipfilemodule:
$ python -m zipfile -c zipname sourcedir
Où zipnameest le nom du fichier de destination que vous souhaitez (ajoutez .zipsi vous le souhaitez, il ne le fera pas automatiquement) et sourcedir est le chemin d'accès au répertoire.
Compressez Python (ou ne voulez tout simplement pas le répertoire parent):
Si vous essayez de compresser un paquet python avec un __init__.pyet __main__.py, et que vous ne voulez pas le répertoire parent, c'est
$ python -m zipfile -c zipname sourcedir/*
Et
$ python zipname
exécuterait le package. (Notez que vous ne pouvez pas exécuter de sous-packages comme point d'entrée à partir d'une archive zippée.)
Zipper une application Python:
Si vous avez python3.5 + et que vous souhaitez spécifiquement compresser un paquet Python, utilisez zipapp :
Cette fonction compressera récursivement une arborescence de répertoires, compressant les fichiers et enregistrant les noms de fichiers relatifs corrects dans l'archive. Les entrées d'archive sont les mêmes que celles générées par zip -r output.zip source_dir.
import os
import zipfile
def make_zipfile(output_filename, source_dir):
relroot = os.path.abspath(os.path.join(source_dir, os.pardir))with zipfile.ZipFile(output_filename,"w", zipfile.ZIP_DEFLATED)as zip:for root, dirs, files in os.walk(source_dir):# add directory (needed for empty dirs)
zip.write(root, os.path.relpath(root, relroot))for file in files:
filename = os.path.join(root, file)if os.path.isfile(filename):# regular files only
arcname = os.path.join(os.path.relpath(root, relroot), file)
zip.write(filename, arcname)
J'ai apporté quelques modifications au code donné par Mark Byers . La fonction ci-dessous ajoute également des répertoires vides si vous en avez. Les exemples devraient clarifier le chemin ajouté au zip.
#!/usr/bin/env pythonimport os
import zipfile
def addDirToZip(zipHandle, path, basePath=""):"""
Adding directory given by \a path to opened zip file \a zipHandle
@param basePath path that will be removed from \a path when adding to archive
Examples:
# add whole "dir" to "test.zip" (when you open "test.zip" you will see only "dir")
zipHandle = zipfile.ZipFile('test.zip', 'w')
addDirToZip(zipHandle, 'dir')
zipHandle.close()
# add contents of "dir" to "test.zip" (when you open "test.zip" you will see only it's contents)
zipHandle = zipfile.ZipFile('test.zip', 'w')
addDirToZip(zipHandle, 'dir', 'dir')
zipHandle.close()
# add contents of "dir/subdir" to "test.zip" (when you open "test.zip" you will see only contents of "subdir")
zipHandle = zipfile.ZipFile('test.zip', 'w')
addDirToZip(zipHandle, 'dir/subdir', 'dir/subdir')
zipHandle.close()
# add whole "dir/subdir" to "test.zip" (when you open "test.zip" you will see only "subdir")
zipHandle = zipfile.ZipFile('test.zip', 'w')
addDirToZip(zipHandle, 'dir/subdir', 'dir')
zipHandle.close()
# add whole "dir/subdir" with full path to "test.zip" (when you open "test.zip" you will see only "dir" and inside it only "subdir")
zipHandle = zipfile.ZipFile('test.zip', 'w')
addDirToZip(zipHandle, 'dir/subdir')
zipHandle.close()
# add whole "dir" and "otherDir" (with full path) to "test.zip" (when you open "test.zip" you will see only "dir" and "otherDir")
zipHandle = zipfile.ZipFile('test.zip', 'w')
addDirToZip(zipHandle, 'dir')
addDirToZip(zipHandle, 'otherDir')
zipHandle.close()
"""
basePath = basePath.rstrip("\\/")+""
basePath = basePath.rstrip("\\/")for root, dirs, files in os.walk(path):# add dir itself (needed for empty dirs
zipHandle.write(os.path.join(root,"."))# add filesfor file in files:
filePath = os.path.join(root, file)
inZipPath = filePath.replace(basePath,"",1).lstrip("\\/")#print filePath + " , " + inZipPath
zipHandle.write(filePath, inZipPath)
Python moderne (3.6+) utilisant le pathlibmodule pour une gestion concise de type OOP des chemins, et pathlib.Path.rglob()pour un globbing récursif. Pour autant que je sache, cela équivaut à la réponse de George V. Reilly: zips avec compression, l'élément le plus haut est un répertoire, conserve des répertoires vides, utilise des chemins relatifs.
from pathlib importPathfrom zipfile import ZIP_DEFLATED,ZipFilefrom os importPathLikefrom typing importUniondef zip_dir(zip_name: str, source_dir:Union[str,PathLike]):
src_path =Path(source_dir).expanduser().resolve(strict=True)withZipFile(zip_name,'w', ZIP_DEFLATED)as zf:for file in src_path.rglob('*'):
zf.write(file, file.relative_to(src_path.parent))
Remarque: comme les indications de type facultatives l'indiquent, zip_namene peut pas être un objet Path ( serait corrigé dans 3.6.2+ ).
J'ai un autre exemple de code qui peut aider, en utilisant python3, pathlib et zipfile. Cela devrait fonctionner dans n'importe quel système d'exploitation.
from pathlib importPathimport zipfile
from datetime import datetime
DATE_FORMAT ='%y%m%d'def date_str():"""returns the today string year, month, day"""return'{}'.format(datetime.now().strftime(DATE_FORMAT))def zip_name(path):"""returns the zip filename as string"""
cur_dir =Path(path).resolve()
parent_dir = cur_dir.parents[0]
zip_filename ='{}/{}_{}.zip'.format(parent_dir, cur_dir.name, date_str())
p_zip =Path(zip_filename)
n =1while p_zip.exists():
zip_filename =('{}/{}_{}_{}.zip'.format(parent_dir, cur_dir.name,
date_str(), n))
p_zip =Path(zip_filename)
n +=1return zip_filename
def all_files(path):"""iterator returns all files and folders from path as absolute path string
"""for child inPath(path).iterdir():yield str(child)if child.is_dir():for grand_child in all_files(str(child)):yield str(Path(grand_child))def zip_dir(path):"""generate a zip"""
zip_filename = zip_name(path)
zip_file = zipfile.ZipFile(zip_filename,'w')print('create:', zip_filename)for file in all_files(path):print('adding... ', file)
zip_file.write(file)
zip_file.close()if __name__ =='__main__':
zip_dir('.')print('end!')
Si vous voulez une fonctionnalité comme le dossier compresser de n'importe quel gestionnaire de fichiers graphique commun, vous pouvez utiliser le code suivant, il utilise le module zipfile . En utilisant ce code, vous aurez le fichier zip avec le chemin comme dossier racine.
import os
import zipfile
def zipdir(path, ziph):# Iterate all the directories and filesfor root, dirs, files in os.walk(path):# Create a prefix variable with the folder structure inside the path folder. # So if a file is at the path directory will be at the root directory of the zip file# so the prefix will be empty. If the file belongs to a containing folder of path folder # then the prefix will be that folder.if root.replace(path,'')=='':
prefix =''else:# Keep the folder structure after the path folder, append a '/' at the end # and remome the first character, if it is a '/' in order to have a path like # folder1/folder2/file.txt
prefix = root.replace(path,'')+'/'if(prefix[0]=='/'):
prefix = prefix[1:]for filename in files:
actual_file_path = root +'/'+ filename
zipped_file_path = prefix + filename
zipf.write( actual_file_path, zipped_file_path)
zipf = zipfile.ZipFile('Python.zip','w', zipfile.ZIP_DEFLATED)
zipdir('/tmp/justtest/', zipf)
zipf.close()
Vous pouvez par exemple sélectionner uniquement dir4et root.txt:
cwd = os.getcwd()
files =[os.path.join(cwd, f)for f in['dir4','root.txt']]with zipfile.ZipFile("selective.zip","w")as myzip:for f in files:
zipall(myzip, f)
Ou tout simplement listdirdans le répertoire d'invocation de script et ajoutez tout à partir de là:
with zipfile.ZipFile("listdir.zip","w")as myzip:for f in os.listdir():if f =="listdir.zip":# Creating a listdir.zip in the same directory# will include listdir.zip inside itself, beware of thiscontinue
zipall(myzip, f)
Tant de réponses ici, et j'espère que je pourrais contribuer avec ma propre version, qui est basée sur la réponse originale (en passant), mais avec une perspective plus graphique, en utilisant également le contexte pour chaque zipfileconfiguration et tri os.walk(), afin d'avoir un sortie ordonnée.
Ayant ces dossiers et ces fichiers (entre autres dossiers), je voulais créer un .zippour chaque cap_dossier:
Voici ce que j'ai appliqué, avec des commentaires pour une meilleure compréhension du processus.
$ cat zip_cap_dirs.py
""" Zip 'cap_*' directories. """import os
import zipfile as zf
for root, dirs, files in sorted(os.walk('.')):if'cap_'in root:print(f"Compressing: {root}")# Defining .zip name, according to Capítulo.
cap_dir_zip ='{}.zip'.format(root)# Opening zipfile context for current root dir. with zf.ZipFile(cap_dir_zip,'w', zf.ZIP_DEFLATED)as new_zip:# Iterating over os.walk list of files for the current root dir. for f in files:# Defining relative path to files from current root dir.
f_path = os.path.join(root, f)# Writing the file on the .zip file of the context
new_zip.write(f_path)
Fondamentalement, pour chaque itération terminée os.walk(path), j'ouvre un contexte pour la zipfileconfiguration et ensuite, itère l'itération sur files, qui est un listdes fichiers du rootrépertoire, formant le chemin relatif pour chaque fichier en fonction du rootrépertoire actuel , en ajoutant à lazipfile contexte qui est en cours d'exécution .
Voici une approche moderne, utilisant pathlib et un gestionnaire de contexte. Place les fichiers directement dans le zip, plutôt que dans un sous-dossier.
def zip_dir(filename: str, dir_to_zip: pathlib.Path):with zipfile.ZipFile(filename,'w', zipfile.ZIP_DEFLATED)as zipf:# Use glob instead of iterdir(), to cover all subdirectories.for directory in dir_to_zip.glob('**'):for file in directory.iterdir():ifnot file.is_file():continue# Strip the first component, so we don't create an uneeded subdirectory# containing everything.
zip_path = pathlib.Path(*file.parts[1:])# Use a string, since zipfile doesn't support pathlib directly.
zipf.write(str(file), str(zip_path))
J'ai préparé une fonction en consolidant la solution de Mark Byers avec les commentaires de Reimund et Morten Zilmer (chemin relatif et y compris les répertoires vides). En tant que meilleure pratique,with est utilisé dans la construction de fichiers ZipFile.
La fonction prépare également un nom de fichier zip par défaut avec le nom du répertoire compressé et l'extension «.zip». Par conséquent, cela fonctionne avec un seul argument: le répertoire source à compresser.
# import required python modules# You have to install zipfile package using pip installimport os,zipfile
# Change the directory where you want your new zip file to be
os.chdir('Type your destination')# Create a new zipfile ( I called it myfile )
zf = zipfile.ZipFile('myfile.zip','w')# os.walk gives a directory tree. Access the files using a for loopfor dirnames,folders,files in os.walk('Type your directory'):
zf.write('Type your Directory')for file in files:
zf.write(os.path.join('Type your directory',file))
Eh bien, après avoir lu les suggestions, j'ai trouvé une méthode très similaire qui fonctionne avec 2.7.x sans créer de noms de répertoires "drôles" (noms absolus), et ne crée que le dossier spécifié à l'intérieur du zip.
Ou juste au cas où vous auriez besoin que votre zip contienne un dossier à l'intérieur avec le contenu du répertoire sélectionné.
def zipDir( path, ziph ):"""
Inserts directory (path) into zipfile instance (ziph)
"""for root, dirs, files in os.walk( path ):for file in files :
ziph.write( os.path.join( root, file ), os.path.basename( os.path.normpath( path ))+"\\"+ file )def makeZip( pathToFolder ):"""
Creates a zip file with the specified folder
"""
zipf = zipfile.ZipFile( pathToFolder +'file.zip','w', zipfile.ZIP_DEFLATED )
zipDir( pathToFolder, zipf )
zipf.close()print("Zip file saved to: "+ pathToFolder)
makeZip("c:\\path\\to\\folder\\to\\insert\\into\\zipfile")
def CREATEZIPFILE(zipname, path):#function to create a zip file#Parameters: zipname - name of the zip file; path - name of folder/file to be put in zip file
zipf = zipfile.ZipFile(zipname,'w', zipfile.ZIP_DEFLATED)
zipf.setpassword(b"password")#if you want to set password to zipfile#checks if the path is file or directoryif os.path.isdir(path):for files in os.listdir(path):
zipf.write(os.path.join(path, files), files)elif os.path.isfile(path):
zipf.write(os.path.join(path), path)
zipf.close()
make_archive
fromshutil
(si vous voulez compresser un seul répertoire récursivement).Réponses:
Comme d'autres l'ont souligné, vous devez utiliser un fichier zip . La documentation vous indique quelles fonctions sont disponibles, mais n'explique pas vraiment comment vous pouvez les utiliser pour compresser un répertoire entier. Je pense qu'il est plus facile d'expliquer avec un exemple de code:
Adapté de: http://www.devshed.com/c/a/Python/Python-UnZipped/
la source
os.path.relpath(os.path.join(root, file), os.path.join(path, '..'))
. Cela vous permettrait de compresser un répertoire à partir de n'importe quel répertoire de travail, sans obtenir les chemins absolus complets dans l'archive.shutil
le rend vraiment facile en une seule ligne. Veuillez vérifier la réponse ci-dessous ...close()
appel me manquait !La façon la plus simple est d'utiliser
shutil.make_archive
. Il prend en charge les formats zip et tar.Si vous devez faire quelque chose de plus compliqué que de zipper tout le répertoire (comme sauter certains fichiers), alors vous devrez creuser dans le
zipfile
module comme d'autres l'ont suggéré.la source
shutil
fait partie de la bibliothèque Python standard. Cela devrait être la meilleure réponseshutil.make_archive
sertos.chdir()
. D'après ce que je lisos.chdir()
, il fonctionne à l'échelle mondiale.Pour ajouter le contenu de
mydirectory
à un nouveau fichier zip, y compris tous les fichiers et sous-répertoires:la source
with
au lieu de devoirclose()
vous appeler à la fin?Dans un script Python
En Python 2.7+,
shutil
a unemake_archive
fonction.Ici, l'archive zippée sera nommée
zipfile_name.zip
. Sibase_dir
est plus bas,root_dir
il exclura les fichiers qui ne se trouvent pas dans lebase_dir
, mais archivera toujours les fichiers dans les répertoires parents jusqu'auroot_dir
.J'ai eu un problème en testant cela sur Cygwin avec 2.7 - il veut un argument root_dir, pour cwd:
Utiliser Python à partir du shell
Vous pouvez le faire avec Python à partir du shell en utilisant également le
zipfile
module:Où
zipname
est le nom du fichier de destination que vous souhaitez (ajoutez.zip
si vous le souhaitez, il ne le fera pas automatiquement) et sourcedir est le chemin d'accès au répertoire.Compressez Python (ou ne voulez tout simplement pas le répertoire parent):
Si vous essayez de compresser un paquet python avec un
__init__.py
et__main__.py
, et que vous ne voulez pas le répertoire parent, c'estEt
exécuterait le package. (Notez que vous ne pouvez pas exécuter de sous-packages comme point d'entrée à partir d'une archive zippée.)
Zipper une application Python:
Si vous avez python3.5 + et que vous souhaitez spécifiquement compresser un paquet Python, utilisez zipapp :
la source
Cette fonction compressera récursivement une arborescence de répertoires, compressant les fichiers et enregistrant les noms de fichiers relatifs corrects dans l'archive. Les entrées d'archive sont les mêmes que celles générées par
zip -r output.zip source_dir
.la source
Utilisez shutil, qui fait partie de l'ensemble de bibliothèques standard python. L'utilisation de shutil est si simple (voir le code ci-dessous):
Code:
la source
Pour ajouter une compression au fichier zip résultant, consultez ce lien .
Vous devez changer:
à
la source
J'ai apporté quelques modifications au code donné par Mark Byers . La fonction ci-dessous ajoute également des répertoires vides si vous en avez. Les exemples devraient clarifier le chemin ajouté au zip.
Ci-dessus est une fonction simple qui devrait fonctionner pour des cas simples. Vous pouvez trouver une classe plus élégante dans mon Gist: https://gist.github.com/Eccenux/17526123107ca0ac28e6
la source
Python moderne (3.6+) utilisant le
pathlib
module pour une gestion concise de type OOP des chemins, etpathlib.Path.rglob()
pour un globbing récursif. Pour autant que je sache, cela équivaut à la réponse de George V. Reilly: zips avec compression, l'élément le plus haut est un répertoire, conserve des répertoires vides, utilise des chemins relatifs.Remarque: comme les indications de type facultatives l'indiquent,
zip_name
ne peut pas être un objet Path ( serait corrigé dans 3.6.2+ ).la source
J'ai un autre exemple de code qui peut aider, en utilisant python3, pathlib et zipfile. Cela devrait fonctionner dans n'importe quel système d'exploitation.
la source
Vous voudrez probablement regarder le
zipfile
module; il y a de la documentation sur http://docs.python.org/library/zipfile.html .Vous pouvez également vouloir
os.walk()
indexer la structure du répertoire.la source
Voici une variation de la réponse donnée par Nux qui fonctionne pour moi:
la source
Essayez celui ci-dessous. Cela a fonctionné pour moi .
la source
Si vous voulez une fonctionnalité comme le dossier compresser de n'importe quel gestionnaire de fichiers graphique commun, vous pouvez utiliser le code suivant, il utilise le module zipfile . En utilisant ce code, vous aurez le fichier zip avec le chemin comme dossier racine.
la source
Pour donner plus de flexibilité, par exemple sélectionnez répertoire / fichier par nom, utilisez:
Pour une arborescence de fichiers:
Vous pouvez par exemple sélectionner uniquement
dir4
etroot.txt
:Ou tout simplement
listdir
dans le répertoire d'invocation de script et ajoutez tout à partir de là:la source
Supposons que vous souhaitiez compresser tous les dossiers (sous-répertoires) du répertoire actuel.
la source
Pour un moyen concis de conserver la hiérarchie des dossiers sous le répertoire parent à archiver:
Si vous le souhaitez, vous pouvez le modifier pour l'utiliser
pathlib
pour la globalisation de fichiers .la source
Tant de réponses ici, et j'espère que je pourrais contribuer avec ma propre version, qui est basée sur la réponse originale (en passant), mais avec une perspective plus graphique, en utilisant également le contexte pour chaque
zipfile
configuration et trios.walk()
, afin d'avoir un sortie ordonnée.Ayant ces dossiers et ces fichiers (entre autres dossiers), je voulais créer un
.zip
pour chaquecap_
dossier:Voici ce que j'ai appliqué, avec des commentaires pour une meilleure compréhension du processus.
Fondamentalement, pour chaque itération terminée
os.walk(path)
, j'ouvre un contexte pour lazipfile
configuration et ensuite, itère l'itération surfiles
, qui est unlist
des fichiers duroot
répertoire, formant le chemin relatif pour chaque fichier en fonction duroot
répertoire actuel , en ajoutant à lazipfile
contexte qui est en cours d'exécution .Et la sortie est présentée comme ceci:
Pour voir le contenu de chaque
.zip
répertoire, vous pouvez utiliser laless
commande:la source
Voici une approche moderne, utilisant pathlib et un gestionnaire de contexte. Place les fichiers directement dans le zip, plutôt que dans un sous-dossier.
la source
J'ai préparé une fonction en consolidant la solution de Mark Byers avec les commentaires de Reimund et Morten Zilmer (chemin relatif et y compris les répertoires vides). En tant que meilleure pratique,
with
est utilisé dans la construction de fichiers ZipFile.La fonction prépare également un nom de fichier zip par défaut avec le nom du répertoire compressé et l'extension «.zip». Par conséquent, cela fonctionne avec un seul argument: le répertoire source à compresser.
la source
la source
Eh bien, après avoir lu les suggestions, j'ai trouvé une méthode très similaire qui fonctionne avec 2.7.x sans créer de noms de répertoires "drôles" (noms absolus), et ne crée que le dossier spécifié à l'intérieur du zip.
Ou juste au cas où vous auriez besoin que votre zip contienne un dossier à l'intérieur avec le contenu du répertoire sélectionné.
la source
Fonction pour créer un fichier zip.
la source
Utiliser zipfly
la source