Programme pour ouvrir des fichier .zip

a marqué ce sujet comme résolu.

Bonjour,

Je possède des centaines de petits fichiers .zip sur mon ordinateur.
J’aimerais écrire un programme en C ou C++ qui soit capable de décompresser ces fichiers.

Le programme prend en paramètre le chemin vers le dossier contenant tous les fichiers .zip.
Il décompresse tous les fichiers un par un, et supprime les fichiers .zip devenus inutiles.

  1. Langage C ou C++ ? Je cherche avant tout de la simplicité mais également des performances, d’où mon choix pour du C / C++ plutôt que du python.
  2. Comment fonctionne la décompression, ? Si possible, pour la simplicité, j’aimerais utiliser un algorithme qui fera le boulot de décompression à ma place.

Merci.

  1. Langage C ou C++ ? Je cherche avant tout de la simplicité mais également des performances, d’où mon choix pour du C / C++ plutôt que du python.
Green

Performances à quel niveau ? Tu as essayé et vu ce que ça donnait ?

Parce que ça semble surtout être des I/O, et la lib standard de Python est plutôt bien fournie pour ce que tu recherches (j’imagine en plus que ça utilise pas mal de code C derrière).

Pour te donner un exemple, ça se fait en 3 lignes.

import pathlib
import zipfile

for path in pathlib.Path().glob('**/*.zip'):
    with zipfile.ZipFile(path, 'r') as zip:
        zip.extractall()

(tu as un paramètre optionnel path à extractall si tu veux éviter de tout extraire dans le répertorie courant).

Salut,

tu peux utiliser libzip pour faire la décompression à ta place, si tu tiens vraiment à faire cela en C/C++, mais franchement ça serait sans doute plus rapide de l’écrire dans un autre langage en utilisant une bibliothéque dédiée…

Ou alors tu l’écris en bash en utilisant directement la commande unzip.

EDIT: @entwanne attention dans la description de zipfile on trouve :

This module does not currently handle multi-disk ZIP files. It can handle ZIP files that use the ZIP64 extensions (that is ZIP files that are more than 4 GiB in size). It supports decryption of encrypted files in ZIP archives, but it currently cannot create an encrypted file. Decryption is extremely slow as it is implemented in native Python rather than C.

+2 -0

Performances à quel niveau ? Tu as essayé et vu ce que ça donnait ?

A vrai dire, je n’ai encore rien testé, je vais commencer par du python si c’est ce qu’il y a de plus simple. Par contre, sais-tu comment gérer les cas où le fichier .zip est protégé par un mot de passe ?

Edit : c’est bon j’ai vu la documentation merci

@Skodt Je me renseigne, merci :)
Par contre, j’aimerais éviter bash vu que mon ordinateur natif tourne sous Windows.

+0 -0

Je me demande quelle est la différence entre le with et une assignation de variables en python ?

import pathlib
import zipfile
"""
for path in pathlib.Path().glob('**/*.zip'):
    with zipfile.ZipFile(path, 'r') as zipp:
        zipp.setpassword('123'.encode('utf-8'))
        zipp.extractall()
"""



for path in pathlib.Path().glob('**/*.zip'):
    zipp = zipfile.ZipFile(path, 'r')
    zipp.setpassword(str(123).encode('utf-8'))
    zipp.extractall()
  1. Langage C ou C++ ? Je cherche avant tout de la simplicité mais également des performances, d’où mon choix pour du C / C++ plutôt que du python.
  2. Comment fonctionne la décompression, ? Si possible, pour la simplicité, j’aimerais utiliser un algorithme qui fera le boulot de décompression à ma place.

Merci.

Green

Python utilise la lib zlib (écrite en C) pour les zip avec compression. Pour les zip sans compression, le problème de performance ne se pose même pas. En revanche, la doc Python indique que les fichiers zip chiffrés sont traités en pur Python, ce qui est lent :

Decryption is extremely slow as it is implemented in native Python rather than C.

https://docs.python.org/3/library/zipfile.html

Si tu as des fichiers zip chiffrés et lourds, il faudra donc faire attention. Mais dans les autres cas, ça devrait passer sans problème !

Par contre, j’aimerais éviter bash vu que mon ordinateur natif tourne sous Windows.

PowerShell ? :p

+0 -0

Par contre, j’aimerais éviter bash vu que mon ordinateur natif tourne sous Windows.

IL existe une version du programme unzip pour windows, je l’ai. Voir du côté du gnuwin32 project pour le télécharger. Après c’est une seule commande !

for /r %f in (*.zip) do unzip "%f"

Ou pour extraire dans des répertoires séparés:

for /r %f in (*.zip) do unzip "%f" -d "%~nf"
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte