Décompressez les fichiers de programme dans .net
Je suis en train d'en programmant décompresser un fichier zippé.
J'ai essayé d'utiliser le System.IO.Compression.GZipStream
classe .NET, mais quand mon application s'exécute (en fait une unité de test), j'ai cette exception:
Système.IO.InvalidDataException: Le nombre magique dans GZip-tête n'est pas correcte. Assurez-vous que vous êtes de passage dans un GZip ruisseau..
Je me rends compte maintenant qu'un .zip
fichier n'est pas le même comme un .gz
fichier, et que GZip
n'est pas le même que Zip
.
Cependant, depuis que je suis en mesure d'extraire le fichier manuellement en double-cliquant sur le fichier compressé, puis en cliquant sur la fonction "Extraire tous les fichiers"bouton, je pense qu'il devrait y avoir un moyen de le faire dans le code.
Donc j'ai essayé d'utiliser Process.Start()
avec le chemin vers le fichier compressé à l'entrée. Cela provoque mon application pour ouvrir une Fenêtre affichant le contenu dans le fichier zippé. C'est tout beau, mais l'application sera installée sur un serveur avec personne autour de cliquer sur "Extraire tous les fichiers"bouton.
Alors, comment puis-je obtenir mon application pour extraire les fichiers dans les fichiers zippés?
Ou est-il un autre moyen de le faire? Je préfère le faire dans le code, sans avoir à télécharger de bibliothèques tierces ou d'applications; le département de la sécurité n'est pas trop de fantaisie à ce sujet...
- Votre service de sécurité est plus heureux avec vous d'écrire votre propre code pour quelque chose que l'utilisation d'une bibliothèque qui a été débuggé et regarda par sans doute beaucoup d'yeux? Vous pouvez utiliser une bibliothèque ET "faire dans le code" (obtenir le code source et le compiler vous-même), mais je vois de réinventer la roue, comme un problème plus important que les problèmes de sécurité apporté par l'aide d'une essayé et vrai de la bibliothèque.
- Lorsque la direction a une idée dans leur tête...
- Il y a moins de risque pour le département de la sécurité si vous obtenez un produit tiers. Il suffit de télécharger dotnetzip et de le renommer "[insérer le nom de la société].ziplibrary.dll"
Vous devez vous connecter pour publier un commentaire.
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 permettre de mieux comprendre si vous avez choisi ici de réinventer la roue.
Avec .NET 4.5 vous pouvez maintenant décompresser des fichiers en utilisant le .NET framework:
Le code ci-dessus a été prise directement à partir de la documentation de Microsoft: http://msdn.microsoft.com/en-us/library/ms404280(v=vs. 110).aspx
ZipFile
est contenue dans l'assembléeSystem.IO.Compression.FileSystem
. (Merci nateirvin...voir le commentaire ci-dessous)ZipFile
est contenue dans l'assembléeSystem.IO.Compression.FileSystem
.System.IO.Compression.FileSystem.dll
.A local file header is corrupt
. Tout bien que sur ce point?Pour .Net 4.5+
Il n'est pas toujours souhaité écrire le fichier non compressé sur le disque. Comme un ASP.Net développeur, j'aurais à jouer avec des autorisations à accorder des droits pour ma demande d'écrire pour le système de fichiers. En travaillant avec des cours d'eau dans la mémoire, je peux contourner tout cela et lire les fichiers directement:
Sinon, vous pouvez toujours écrire le fichier décompressé sur le disque en appelant
ExtractToFile()
:D'utiliser le
ZipArchive
classe, vous devez ajouter une référence à laSystem.IO.Compression
espace de noms et deSystem.IO.Compression.FileSystem
.ZipArchive
objet s'inscrit le projet de loi joliment.A local file header is corrupt
. Tout bien que sur ce point?foreach
boucle àExtractToFile
quand je peux utiliserZipFile.ExtractToDirectory(inputFile, outputDir);
Quel est l'avantage de la première méthode?copy \b file1.mp3 + file2.zip file1.mp3
)'ZipArchiveEntry' does not contain a definition for 'ExtractToFile'
et je trouve que, au lieu de cela, je dois utiliser la méthode statiqueSystem.IO.Compression.ZipFileExtensions.ExtractToFile
.Libre, et pas extérieure des fichiers DLL. Tout est dans un fichier CS. Un téléchargement est juste le CS fichier, un autre téléchargement est très facile à comprendre, par exemple. Juste essayé aujourd'hui et je ne peux pas croire à quel point il est simple de l'installation a été. Il a travaillé sur le premier essai, pas d'erreur, rien.
https://github.com/jaime-olivares/zipstorer
Utiliser la bibliothèque de DotNetZip à http://www.codeplex.com/DotNetZip
L'utilisation de la classe ZipFile, vous devez ajouter une référence au Système.IO.La Compression.Système de fichiers de l'assemblée dans votre projet
Standard des fichiers zip normalement utiliser l'algorithme deflate.
Pour extraire des fichiers sans utiliser des bibliothèques tierces utilisation DeflateStream. Vous aurez besoin d'un peu plus d'informations sur le fichier zip format d'archive que Microsoft ne fournit l'algorithme de compression.
Vous pouvez aussi essayer d'utiliser zipfldr.dll. C'est Microsoft bibliothèque de compression (dossiers compressés à partir du menu Envoyer vers). Il semble être une bibliothèque com mais c'est sans-papiers. Vous pourriez être en mesure de le faire fonctionner pour vous par le biais de l'expérimentation.
De ici :
J'utilise ce soit de compresser ou de décompresser des fichiers multiples. La Regex n'est pas nécessaire, mais je l'utilise pour modifier le timbre à date et d'enlever les caractères de soulignement. J'utilise la chaîne vide dans le Compresser >> zipPath chaîne de préfixe quelque chose pour tous les fichiers si nécessaire. Aussi, j'ai l'habitude de commenter soit Compresser() ou Décompresser() basé sur ce que je suis en train de faire.
Vous pouvez tout faire à l'intérieur .NET 3.5 à l'aide de DeflateStream. La chose qui manque dans .NET 3.5 est la capacité à traiter le fichier d'en-tête des sections qui sont utilisées pour organiser les fichiers zippés. PKWare a publié cette information, que vous pouvez utiliser pour traiter les fichier zip après avoir créer les structures qui sont utilisées. Il n'est pas particulièrement lourde, et une bonne pratique de l'outil de construction sans l'aide de la 3e partie du code.
Il n'est pas une ligne de la réponse, mais c'est complètement faisable si vous êtes prêt et capable de prendre le temps de vous-même. J'ai écrit une classe pour ce faire, dans une couple d'heures, et ce que j'ai obtenu à partir de qui est la capacité de compresser et de décompresser des fichiers à l'aide .NET 3.5 seul.
Cela fera
System.IO.Compression.ZipFile.ExtractToDirectory(ZipName, ExtractToPath)
J'ai découvert cette une (Décompressez le paquet sur NuGet) aujourd'hui, depuis que j'ai rencontré un dur bug dans DotNetZip, et j'ai réalisé il n'y a pas vraiment beaucoup de travail de fait sur DotNetZip pour les deux dernières années.
Décompressez le package est maigre, et il a fait le travail pour moi - il n'a pas eu le bug qui DotNetZip avait. En outre, il est raisonnablement petit fichier, en s'appuyant sur le Microsoft BCL pour la décompression. Je pourrais facilement faire des ajustements dont j'avais besoin (pour être en mesure de suivre l'état d'avancement lors de la décompression). Je le recommande.
D'Intégrer Des Ressources:
Jusqu'à présent, j'ai été en utilisant cmd processus afin d'en extraire une .iso fichier, le copier dans un chemin d'accès temporaire à partir du serveur et de l'extrait sur une clé usb. Récemment, j'ai trouvé que cela fonctionne parfaitement avec .l'iso qui sont à moins de 10 go. Pour un iso comme 29Gb cette méthode est coincé quelque sorte.
vous pouvez utiliser Info-décompressez ligne de commande de la morue.vous avez seulement besoin de télécharger unzip.exe Info-décompressez le site officiel.