Compression de fichiers avec FWZip

Dans un article précédent j’avais parlé de la classe TZipFile qui permet de faire de la compression de fichiers. Elle est très pratique. Par contre, il y a une fonctionnalité manquante qui est importante pour moi. Il s’agit de l’ajout d’un mot de passe à l’archive. C’est une limitation qui est connue d’Embarcadero depuis C++Builder XE2. Malheureusement il n’y a pas encore de solution qui a été apportée.

Je suis tombé par hasard sur une bibliothèque qui supporte cette fonctionnalité. Il s’agit de FWZip de Александр (Rouse_) Багель. Elle est codée en Pascal Objet et fonctionne sur Win32 et Win64 dans des projets VCL et FireMonkey. Elle peut être téléchargée sur GitHub.

C’est très simple à utiliser. Il faut d’abord ajouter les fichiers suivants à votre projet:

  • FWZipConsts.pas
  • FWZipCrc32.pas
  • FWZipCrypt.pas
  • FWZipReader.pas
  • FWZipStream.pas
  • FWZipWriter.pas
  • FWZipZLib.pas

On ajoute ensuite le fichier d’en-tête et la bibliothèque nécessaire.

#include <FWZipWriter.hpp>
#pragma comment(lib, "Shlwapi") // Pour PathCanonicalizeW / PathCanonicalizeA

Pour écrire une archive, on utilise ce code:

    TFWZipWriter* Zip = new TFWZipWriter(false,
        Fwzipzlib::TCompressionLevel::clLevel3, "MotDePasse");

    Zip->AddFile("C:\\img\\img0.png");
    Zip->AddFile("C:\\img\\img1.png");

    Zip->BuildZip("C:\\img\\images.zip");

    delete Zip;

Et voilà, maintenant lors de l’extraction des fichiers, un mot de passe sera demandé.

7-Zip Enter password window
Fenêtre de saisie de mot passe du logiciel 7-Zip