Section courante

A propos

Section administrative du site

 Langage  Elément  Tutoriel  Annexe  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Introduction
Référence des fonctions
Les premiers pas
Les codes d'erreurs
Préface
Notes légales
Dictionnaire
Recherche

Les premiers pas

libzip est une bibliothèque en C permettant de lire, créer et modifier des fichiers ZIP. Elle fournit une API simple et efficace pour manipuler des archives ZIP.

Installation

Sur Linux (Debian/Ubuntu) :

sudo apt install libzip-dev

Sur macOS :

brew install libzip

Sur Windows, vous pouvez utiliser vcpkg :

vcpkg install libzip

Inclure libzip dans un programme C

L'intégration de libzip dans un programme C commence par l'installation et la configuration de la bibliothèque. La première étape consiste à installer libzip sur le système. Sous Linux, elle est souvent disponible via les gestionnaires de paquets comme apt (sudo apt install libzip-dev) ou dnf (sudo dnf install libzip-devel). Sous Windows, l'installation peut être effectuée via vcpkg ou MSYS2. Une fois la bibliothèque installée, il est nécessaire d'inclure le fichier d'en-tête principal en ajoutant #include <zip.h> dans le code source. Cela permet d'accéder aux différentes fonctions de la bibliothèque.

Lors de la compilation d'un programme utilisant libzip, il est important de lier correctement la bibliothèque. Avec GCC, cela se fait en ajoutant l'option -lzip à la ligne de compilation. Par exemple, pour compiler un programme nommé main.c.

Si la bibliothèque est installée dans un emplacement non standard, il peut être nécessaire d'ajouter des options supplémentaires comme -I pour les entêtes et -L pour les bibliothèques partagées. Sous CMake, l'intégration de libzip peut être facilitée avec find_package(libzip REQUIRED), suivi de target_link_libraries(mon_programme PRIVATE libzip).

Une fois libzip incluse, il est possible d'utiliser ses fonctionnalités pour gérer des fichiers ZIP. La fonction zip_open permet d'ouvrir une archive en lecture ou écriture, tandis que zip_close s'assure que toutes les modifications sont correctement enregistrées. Lorsqu'un fichier doit être ajouté à une archive ZIP, zip_file_add est utilisée en combinaison avec zip_source_buffer ou zip_source_file pour inclure des données provenant d'un tampon ou d'un fichier existant. Ces fonctions permettent de créer et de manipuler des archives ZIP de manière efficace et flexible.

En lecture, libzip offre des fonctions comme zip_fopen pour ouvrir un fichier au sein d'une archive, et zip_fread pour extraire ses données. Il est souvent utile d'utiliser zip_stat pour obtenir des informations sur un fichier, telles que sa taille ou son mode de compression. L'utilisation correcte de libzip implique également la gestion des erreurs avec zip_error_to_str et zip_strerror, facilitant le diagnostic des problèmes rencontrés lors des opérations. Une fois le programme terminé, toutes les ressources utilisées doivent être libérées pour éviter les fuites de mémoire, en fermant les fichiers et l'archive avec zip_fclose et zip_close.

Grâce à sa facilité d'intégration et à ses nombreuses fonctionnalités, libzip est une bibliothèque puissante pour manipuler des archives ZIP dans un programme C. Son API bien structurée permet de travailler efficacement avec des fichiers compressés, que ce soit pour les créer, les lire ou les modifier. L'adoption des bonnes pratiques, comme la gestion des erreurs et la fermeture correcte des fichiers, garantit une utilisation optimale de la bibliothèque. Avec ces bases en place, un programmeur peut exploiter pleinement libzip pour ajouter des fonctionnalités de compression et d'archivage à ses applications.

Ainsi, ajoutez l'entête suivant à votre code :

  1. #include <zip.h>

Lors de la compilation, liez la bibliothèque avec -lzip :

gcc mon_programme.c -o mon_programme -lzip

Fonctions essentielles pour inclure libzip dans un programme C

Nom de la fonction Description
zip_open Cette fonction permet d'ouvrir une archive ZIP pour lecture ou écriture.
zip_close Cette fonction permet de fermer l'archive ZIP et enregistre les modifications.
zip_file_add Cette fonction permet d'ajouter un fichier à l'archive ZIP.
zip_source_buffer Cette fonction permet de créer une source ZIP à partir d'un tampon mémoire.
zip_source_file Cette fonction permet de créer une source ZIP à partir d'un fichier sur disque.
zip_stat Cette fonction permet de récupérer des informations sur un fichier dans l'archive.
zip_fopen Cette fonction permet d'ouvrir un fichier contenu dans l'archive ZIP.
zip_fread Cette fonction permet de lire les données d'un fichier dans une archive ZIP.
zip_fclose Cette fonction permet de fermer un fichier ouvert à l'intérieur de l'archive.
zip_error_to_str Cette fonction permet de convertir un code d'erreur ZIP en message texte lisible.

Création d'une archive ZIP

La création d'une archive ZIP avec libzip est une tâche essentielle pour gérer des fichiers compressés dans un programme en C. libzip est une bibliothèque permettant de manipuler des fichiers ZIP de manière flexible et efficace. Pour créer une nouvelle archive ZIP, il est nécessaire d'utiliser la fonction zip_open avec le mode ZIP_CREATE, créant un fichier ZIP s'il n'existe pas. Une fois l'archive ouverte, des fichiers ou des répertoires peuvent y être ajoutés en utilisant zip_file_add ou zip_dir_add. Chaque fichier peut être inséré soit directement depuis le disque, soit en générant son contenu en mémoire avant de l'ajouter.

L'ajout d'un fichier dans une archive ZIP nécessite une source de données, pouvant être un fichier existant ou un tampon mémoire. Si le fichier est sur le disque, la fonction zip_source_file_create permet de le convertir en source pour l'ajouter ensuite à l'archive avec zip_file_add. Alternativement, si le contenu du fichier est généré dynamiquement, zip_source_buffer_create peut être utilisé pour créer une source à partir d'un tableau de données. Une fois la source créée, il est crucial de l'ajouter avec zip_file_add, en spécifiant un nom de fichier qui apparaîtra dans l'archive ZIP.

L'archivage ne se limite pas à l'ajout de fichiers individuels. libzip permet également d'ajouter des répertoires avec la fonction zip_dir_add, ce qui facilite la gestion d'archives complexes contenant une structure de dossiers. Les fichiers ajoutés peuvent être compressés en spécifiant un mode de compression via zip_set_file_compression, supportant notamment la compression Deflate, couramment utilisée dans les archives ZIP. La bibliothèque offre aussi la possibilité d'ajouter des métadonnées comme des commentaires via zip_set_archive_comment et zip_set_file_comment, permettant de documenter le contenu de l'archive.

Une fois tous les fichiers ajoutés, l'archive doit être correctement enregistrée et fermée en utilisant la fonction zip_close. Cette étape est essentielle pour s'assurer que tous les fichiers et métadonnées ont été correctement écrits. En cas d'erreur ou d'annulation du processus, il est possible de fermer l'archive sans sauvegarder les modifications en utilisant zip_discard. Cette fonctionnalité est utile lorsque des opérations échouent en cours de traitement, évitant ainsi la création d'archives ZIP corrompues ou incomplètes.

L'utilisation de libzip pour la création d'archives ZIP est donc à la fois puissante et flexible. Elle permet de manipuler des fichiers ZIP de manière détaillée, avec la prise en charge des fichiers volumineux, de la compression, du chiffrement et des métadonnées. En maîtrisant les principales fonctions de la bibliothèque, un programmeur peut facilement intégrer la gestion des fichiers ZIP dans ses applications, que ce soit pour l'archivage, la sauvegarde ou l'échange de données.

Fonctions essentielles pour la création d'une archive ZIP

Ce tableau regroupe les fonctions de base pour manipuler une archive ZIP avec libzip :

Nom de la fonction Description
zip_open Cette fonction ouvre une archive ZIP existante ou en crée une nouvelle si elle n'existe pas.
zip_close Cette fonction ferme l'archive ZIP et enregistre toutes les modifications apportées.
zip_discard Cette fonction ferme une archive ZIP sans enregistrer les modifications.
zip_file_add Cette fonction ajoute un fichier à l'archive ZIP en utilisant une source de données.
zip_dir_add Cette fonction ajoute un répertoire vide à l'archive ZIP.
zip_source_file_create Cette fonction crée une source de fichier à partir d'un fichier sur le disque.
zip_source_buffer_create Cette fonction crée une source de fichier à partir d'un tampon mémoire.
zip_set_file_compression Cette fonction définit la méthode de compression d'un fichier dans l'archive.
zip_set_archive_comment Cette fonction ajoute un commentaire global à l'archive ZIP.
zip_set_file_comment Cette fonction ajoute un commentaire à un fichier spécifique dans l'archive ZIP.

Exemple

Voici un exemple pour créer une archive ZIP et y ajouter un fichier texte :

  1. #include <stdio.h>
  2. #include <zip.h>
  3.  
  4. int main() {
  5.     int error;
  6.     zip_t *zip = zip_open("archive.zip", ZIP_CREATE | ZIP_TRUNCATE, &error);
  7.     if (!zip) {
  8.         printf("Erreur lors de la création du ZIP\n");
  9.         return 1;
  10.     }
  11.  
  12.     zip_source_t *source = zip_source_buffer(zip, "Contenu du fichier", 18, 0);
  13.     if (!source || zip_file_add(zip, "fichier.txt", source, ZIP_FL_OVERWRITE) < 0) {
  14.         zip_source_free(source);
  15.         zip_close(zip);
  16.         printf("Erreur lors de l'ajout du fichier\n");
  17.         return 1;
  18.     }
  19.  
  20.     zip_close(zip);
  21.     printf("Archive ZIP créée avec succès\n");
  22.     return 0;
  23. }

Lecture d'une archive ZIP

La lecture d'une archive ZIP avec libzip est une tâche courante pour extraire des fichiers compressés ou analyser leur contenu sans nécessairement les décompresser. La première étape consiste à ouvrir l'archive en lecture avec zip_open, en utilisant le mode ZIP_RDONLY pour éviter toute modification accidentelle. Une fois l'archive ouverte, on peut obtenir des informations générales comme le nombre de fichiers qu'elle contient à l'aide de zip_get_num_entries. Cela permet d'itérer sur les fichiers contenus et de récupérer leurs noms, tailles et autres métadonnées.

Pour accéder aux informations d'un fichier spécifique dans l'archive, libzip propose la fonction zip_stat, retournant des détails comme la taille du fichier compressé et non compressé, son mode de compression et sa position dans l'archive. Si l'on souhaite récupérer uniquement le nom d'un fichier sans extraire son contenu, zip_get_name permet d'obtenir directement son chemin à l'intérieur de l'archive. Ces fonctions sont essentielles pour naviguer efficacement dans une archive ZIP et identifier les fichiers d'intérêt.

Lorsqu'on veut lire un fichier contenu dans l'archive, il faut d'abord l'ouvrir avec zip_fopen. Cette fonction retourne un pointeur vers un objet de type zip_file_t, pouvant être utilisé pour lire les données du fichier compressé. La lecture des données se fait ensuite avec zip_fread, fonctionnant de manière similaire à fread en C, en copiant les données décompressées dans un tampon mémoire. Une fois la lecture terminée, il est crucial de fermer le fichier avec zip_fclose pour libérer les ressources.

Outre la lecture du contenu des fichiers, libzip permet aussi d'accéder aux commentaires entreposés dans l'archive ZIP ou attachés à des fichiers spécifiques. zip_get_archive_comment permet d'obtenir le commentaire global de l'archive, tandis que zip_file_get_comment permet de lire un commentaire associé à un fichier individuel. Ces fonctionnalités sont utiles pour interpréter des archives contenant des annotations, comme des indications sur les fichiers ou des descriptions ajoutées par l'auteur.

Une fois toutes les opérations terminées, l'archive doit être fermée correctement avec zip_close pour éviter toute fuite de mémoire. Si une erreur survient avant la fermeture, il est possible d'utiliser zip_discard pour abandonner les modifications en cours. Grâce à ces fonctions, libzip offre une méthode efficace pour lire et analyser les fichiers ZIP, que ce soit pour extraire des données, explorer leur contenu ou récupérer des informations sans extraction complète.

Fonctions essentielles pour la lecture d'une archive ZIP

Ce tableau regroupe les fonctions essentielles pour lire et analyser une archive ZIP avec libzip :

Nom de la fonction Description
zip_open Cette fonction permet d'ouvrir une archive ZIP en mode lecture ou écriture.
zip_get_num_entries Cette fonction permet de retourner le nombre total de fichiers dans l'archive.
zip_stat Cette fonction permet de récupérer des informations détaillées sur un fichier donné dans l'archive.
zip_get_name Cette fonction permet de demander le nom d'un fichier à une position donnée dans l'archive.
zip_fopen Cette fonction permet d'ouvrir un fichier à l'intérieur de l'archive ZIP pour lecture.
zip_fread Cette fonction permet de lire le contenu d'un fichier ouvert à partir de l'archive ZIP.
zip_fclose Cette fonction permet de fermer un fichier précédemment ouvert dans l'archive ZIP.
zip_get_archive_comment Cette fonction permet de récupérer le commentaire global de l'archive ZIP.
zip_file_get_comment Cette fonction permet de récupérer le commentaire d'un fichier spécifique dans l'archive ZIP.
zip_close Cette fonction permet de fermer proprement l'archive ZIP après lecture.

Exemple

Exemple pour lister le contenu d'un fichier ZIP :

  1. #include <stdio.h>
  2. #include <zip.h>
  3.  
  4. int main() {
  5.     int error;
  6.     zip_t *zip = zip_open("archive.zip", ZIP_RDONLY, &error);
  7.     if (!zip) {
  8.         printf("Erreur d'ouverture du ZIP\n");
  9.         return 1;
  10.     }
  11.  
  12.     zip_int64_t num_files = zip_get_num_entries(zip, 0);
  13.     for (zip_int64_t i = 0; i < num_files; i++) {
  14.         printf("%s\n", zip_get_name(zip, i, 0));
  15.     }
  16.  
  17.     zip_close(zip);
  18.     return 0;
  19. }

Extraction d'un fichier

L'extraction d'un fichier à partir d'une archive ZIP est une opération courante dans de nombreuses applications de gestion de fichiers compressés. Avec libzip, cette tâche commence par l'ouverture de l'archive en mode lecture à l'aide de zip_open. Une fois l'archive chargée, il est possible d'identifier le fichier à extraire en récupérant son index avec zip_name_locate ou directement en utilisant son nom. Pour obtenir des informations détaillées sur le fichier avant extraction, la fonction zip_stat permet d'accéder à sa taille, son mode de compression et d'autres métadonnées.

Une fois le fichier identifié, libzip propose la fonction zip_fopen pour l'ouvrir en mode lecture. Cette fonction retourne un pointeur vers un objet zip_file_t, représentant le fichier compressé au sein de l'archive. Pour extraire son contenu, il faut ensuite lire ses données avec zip_fread, fonctionnant de manière similaire à fread en C. Cette fonction copie les données décompressées dans un tampon mémoire, permettant ainsi de les traiter, les enregistrer sur le disque ou les manipuler en mémoire selon les besoins.

L'écriture du fichier extrait sur le disque est une étape clef du processus d'extraction. Après avoir lu les données du fichier compressé avec zip_fread, elles doivent être écrites sur un fichier de sortie en utilisant fwrite. Pour assurer un bon transfert des données, il est recommandé d'utiliser une boucle de lecture-écriture, en lisant des blocs de données jusqu'à atteindre la fin du fichier. Une fois l'extraction terminée, il est essentiel de fermer le fichier extrait avec fclose ainsi que le fichier compressé avec zip_fclose pour libérer les ressources allouées.

Dans certains cas, l'extraction peut être conditionnée par le type de compression utilisé. libzip prend en charge plusieurs algorithmes, notamment la compression Deflate, étant la plus courante. Il est possible de vérifier la méthode de compression d'un fichier avec zip_stat, ce qui peut être utile si l'on doit gérer des formats spécifiques. Si un fichier est stocké sans compression, son extraction est encore plus rapide car les données sont directement lues sans décompression.

Une fois toutes les opérations terminées, l'archive ZIP doit être fermée proprement à l'aide de zip_close pour éviter toute fuite de mémoire. Si une erreur survient en cours d'extraction, il est recommandé d'utiliser zip_discard pour annuler les modifications et libérer les ressources associées. Grâce aux fonctionnalités de libzip, l'extraction de fichiers ZIP devient une tâche simple et efficace, adaptée aux besoins des applications nécessitant la gestion de fichiers compressés.

Fonctions essentielles pour l'extraction d'un fichier ZIP

Ce tableau regroupe les fonctions nécessaires pour extraire un fichier avec libzip :

Nom de la fonction Description
zip_open Cette fonction permet d'ouvrir une archive ZIP en lecture ou écriture.
zip_name_locate Cette fonction permet de trouver l'index d'un fichier dans l'archive en fonction de son nom.
zip_stat Cette fonction permet de récupérer des informations sur un fichier spécifique dans l'archive.
zip_fopen Cette fonction permet d'ouvrir un fichier dans l'archive ZIP pour lecture.
zip_fread Cette fonction permet de lire le contenu du fichier extrait depuis l'archive ZIP.
fwrite Cette fonction permet d'écrire les données extraites dans un fichier sur le disque.
zip_fclose Cette fonction permet de fermer le fichier extrait après lecture.
zip_close Cette fonction permet de fermer proprement l'archive ZIP après extraction.
zip_discard Cette fonction permet d'annuler toutes les modifications et libère les ressources en cas d'erreur.

Exemple

Voici comment extraire un fichier d'une archive ZIP :

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <zip.h>
  4.  
  5. int main() {
  6.     int error;
  7.     zip_t *zip = zip_open("archive.zip", ZIP_RDONLY, &error);
  8.     if (!zip) {
  9.         printf("Erreur d'ouverture du ZIP\n");
  10.         return 1;
  11.     }
  12.  
  13.     struct zip_stat st;
  14.     zip_stat_init(&st);
  15.     zip_stat(zip, "fichier.txt", 0, &st);
  16.  
  17.     zip_file_t *file = zip_fopen(zip, "fichier.txt", 0);
  18.     if (!file) {
  19.         printf("Erreur d'ouverture du fichier dans le ZIP\n");
  20.         zip_close(zip);
  21.         return 1;
  22.     }
  23.  
  24.     char *content = malloc(st.size + 1);
  25.     zip_fread(file, content, st.size);
  26.     content[st.size] = '\0';
  27.     printf("Contenu du fichier : %s\n", content);
  28.     
  29.     free(content);
  30.     zip_fclose(file);
  31.     zip_close(zip);
  32.     return 0;
  33. }


PARTAGER CETTE PAGE SUR
Dernière mise à jour : Mardi, le 8 octobre 2024