2010-08-16 23 views
7

J'ai déjà utilisé Chilkat Zip .Net pour générer des fichiers de sauvegarde à partir de mon application, mais après avoir eu des problèmes avec le composant, déplacé vers Xceed Zip .Net pour la même fonction.Correction d'en-têtes de fichier ZIP corrompu

Si vous prenez l'un des Zips générés avec le Chilkat et tentez d'extraire en utilisant Xceed, 7Zip, WinZip alors il échoue.

Si vous prenez le même fichier et extrayez avec Chilkat, Windows Zip, WinRar puis les extraits de fichier très bien. Ayant lu Wikipedia sur le format WinZip, j'ai étudié le répertoire central et l'en-tête du fichier local, et il semble que le composant Chilkat ait écrit incorrectement la taille de l'enregistrement du répertoire central. Si vous utilisez quelque chose comme FRHed pour éditer l'enregistrement central et que la taille du fichier est identique à la taille de l'en-tête local, tout est extrait correctement.

Que me recommanderiez-vous?

  1. Ecrire un petit utilitaire en utilisant la bibliothèque Chilkat pour extraire le Zip puis recompresser avec la Bibliothèque Xceed
  2. Lire le fichier Zip à la recherche pour les marqueurs Zip nécessaires (tel que défini dans les spécifications), puis corriger la centrale Entête.
  3. Autre combinaison.

Répondre

2

Cela dépend du nombre de sauvegardes générées par votre programme. Probablement, il serait plus facile de les décompresser/recompresser du programme ou des mains. Cependant, s'il y a beaucoup de fichiers, le meilleur moyen serait de fixer les champs d'enregistrement du répertoire central - vous devez écrire du code, qui 1) recherche le répertoire central; 2) pour chaque enregistrement, va à la position où l'en-tête de fichier local est stocké, et lire la taille du fichier; 3) revenir au répertoire central et y écrire une taille de fichier valide; 4) Attention aux fichiers volumineux, s'ils le sont - la taille du fichier pour les fichiers> 4Go est écrite en extension.

+0

Merci. Ce que j'ai fini par faire est ce que vous avez écrit, je viens de décompresser les anciens fichiers de sauvegarde, puis les recompresser MAIS seulement si le fichier lui-même présentait l'erreur dans l'enregistrement. J'ai fait une petite application qui est livrée en tant que module de support à notre application de sorte que l'ancienne bibliothèque était là pour être utilisée. –