J'essaie de décompresser par programme un fichier zippé.
J'ai essayé d'utiliser la System.IO.Compression.GZipStream
classe en .NET, mais lorsque mon application s'exécute (en fait un test unitaire), j'obtiens cette exception:
System.IO.InvalidDataException: le nombre magique dans l'en-tête GZip n'est pas correct. Assurez-vous que vous passez dans un flux GZip ..
Je me rends compte maintenant qu'un .zip
fichier n'est pas le même qu'un .gz
fichier, et ce GZip
n'est pas la même chose que Zip
.
Cependant, comme je suis capable d'extraire le fichier en double-cliquant manuellement sur le fichier compressé puis en cliquant sur le bouton "Extraire tous les fichiers", je pense qu'il devrait également y avoir un moyen de le faire dans le code.
Par conséquent, j'ai essayé d'utiliser Process.Start()
avec le chemin d'accès au fichier compressé en entrée. Cela amène mon application à ouvrir une fenêtre affichant le contenu du fichier compressé. C'est très bien, mais l'application sera installée sur un serveur sans aucun pour cliquer sur le bouton "Extraire tous les fichiers".
Alors, comment puis-je obtenir mon application pour extraire les fichiers dans les fichiers compressés?
Ou existe-t-il une autre façon de procéder? Je préfère le faire en code, sans télécharger de bibliothèques ou d'applications tierces; le service de sécurité n'a pas trop envie de ça ...
Réponses:
Nous avons utilisé SharpZipLib avec succès sur de nombreux projets. Je sais que c'est un outil tiers, mais le code source est inclus et pourrait fournir un aperçu si vous choisissez de réinventer la roue ici.
la source
Avec .NET 4.5, vous pouvez désormais décompresser des fichiers à l'aide du framework .NET:
Le code ci-dessus provient directement de la documentation de Microsoft: http://msdn.microsoft.com/en-us/library/ms404280(v=vs.110).aspx
ZipFile
est contenu dans l'assemblageSystem.IO.Compression.FileSystem
. (Merci nateirvin ... voir le commentaire ci-dessous)la source
ZipFile
est contenu dans l'assemblageSystem.IO.Compression.FileSystem
.System.IO.Compression.FileSystem.dll
.A local file header is corrupt
. Mais quoi que ce soit à ce sujet?Pour .Net 4.5+
Il n'est pas toujours souhaitable d'écrire le fichier non compressé sur le disque. En tant que développeur ASP.Net, je devrais jouer avec les autorisations pour accorder des droits pour que mon application écrive sur le système de fichiers. En travaillant avec des flux en mémoire, je peux contourner tout cela et lire les fichiers directement:
Alternativement, vous pouvez toujours écrire le fichier décompressé sur le disque en appelant
ExtractToFile()
:Pour utiliser la
ZipArchive
classe, vous devrez ajouter une référence à l'System.IO.Compression
espace de noms et àSystem.IO.Compression.FileSystem
.la source
ZipArchive
objet correspond parfaitement à la facture.foreach
boucleExtractToFile
quand je peux simplement utiliserZipFile.ExtractToDirectory(inputFile, outputDir);
Quel est l'avantage de la première méthode?Gratuit et aucun fichier DLL externe. Tout est dans un seul fichier CS. Un téléchargement n'est que le fichier CS, un autre téléchargement est un exemple très facile à comprendre. Je viens de l'essayer aujourd'hui et je ne peux pas croire à quel point la configuration était simple. Cela a fonctionné du premier coup, pas d'erreurs, rien.
https://github.com/jaime-olivares/zipstorer
la source
Utilisez la bibliothèque DotNetZip à http://www.codeplex.com/DotNetZip
la source
Pour utiliser la classe ZipFile, vous devez ajouter une référence à l'assembly System.IO.Compression.FileSystem dans votre projet
la source
Les fichiers zip standard utilisent normalement l'algorithme de dégonflage.
Pour extraire des fichiers sans utiliser de bibliothèques tierces, utilisez DeflateStream. Vous aurez besoin d'un peu plus d'informations sur le format d'archive du fichier zip car Microsoft ne fournit que l'algorithme de compression.
Vous pouvez également essayer d'utiliser zipfldr.dll. Il s'agit de la bibliothèque de compression de Microsoft (dossiers compressés à partir du menu Envoyer vers). Il semble que ce soit une bibliothèque de com mais elle n'est pas documentée. Vous pourrez peut-être le faire fonctionner pour vous grâce à l'expérimentation.
la source
Je l'utilise pour compresser ou décompresser plusieurs fichiers. Le truc Regex n'est pas requis, mais je l'utilise pour changer le timbre à date et supprimer les traits de soulignement indésirables. J'utilise la chaîne vide dans la chaîne Compress >> zipPath pour préfixer quelque chose à tous les fichiers si nécessaire. En outre, je commente généralement Compress () ou Decompress () en fonction de ce que je fais.
la source
Cela le fera
System.IO.Compression.ZipFile.ExtractToDirectory(ZipName, ExtractToPath)
la source
D' ici :
la source
Vous pouvez tout faire dans .NET 3.5 à l'aide de DeflateStream. La chose qui manque dans .NET 3.5 est la possibilité de traiter les sections d'en-tête de fichier utilisées pour organiser les fichiers zippés. PKWare a publié ces informations, que vous pouvez utiliser pour traiter le fichier zip après avoir créé les structures utilisées. Ce n'est pas particulièrement onéreux, et c'est une bonne pratique dans la construction d'outils sans utiliser de code tiers.
Ce n'est pas une réponse d'une seule ligne, mais c'est complètement faisable si vous êtes disposé et capable de prendre le temps vous-même. J'ai écrit une classe pour le faire en quelques heures et ce que j'ai obtenu c'est la possibilité de compresser et de décompresser des fichiers en utilisant .NET 3.5 uniquement.
la source
J'ai découvert celui-ci (package Unzip sur NuGet) aujourd'hui, car j'ai rencontré un bogue dur dans DotNetZip, et j'ai réalisé qu'il n'y avait pas vraiment beaucoup de travail effectué sur DotNetZip au cours des deux dernières années.
Le paquet Unzip est maigre, et il a fait le travail pour moi - il n'avait pas le bug que DotNetZip avait. En outre, il s'agissait d'un fichier raisonnablement petit, s'appuyant sur le Microsoft BCL pour la décompression réelle. Je pouvais facilement faire les ajustements dont j'avais besoin (pour pouvoir suivre la progression pendant la décompression). Je le recommande.
la source
De Embed Ressources:
la source
Jusqu'à présent, j'utilisais des processus cmd pour extraire un fichier .iso, le copier dans un chemin temporaire depuis le serveur et extrait sur une clé USB. Récemment, j'ai trouvé que cela fonctionnait parfaitement avec des .iso de moins de 10 Go. Pour une iso comme 29 Go, cette méthode est bloquée d'une manière ou d'une autre.
la source
vous pouvez utiliser la ligne de commande Info-unzip cod.vous n'avez qu'à télécharger unzip.exe depuis le site officiel d'Info-unzip.
la source