Comment créer ZipArchive correctement?
je suis en train d'écrire Desktop application WPF (.Net Framework 4.5) et l'une des tâches est d'enregistrer plusieurs fichiers d'archive zip. J'ai fait les 2 méthodes. D'abord pour créer des zip, deuxième de lire.
public static String GetFileContent(String zipPath, String entityName)
{
String retVal = String.Empty;
using (ZipArchive zipfile = ZipFile.OpenRead(zipPath))
{
foreach (ZipArchiveEntry entry in zipfile.Entries)
{
if (entry.Name.ToLower() == entityName)
{
using (StreamReader s = new StreamReader(entry.Open()))
{
retVal = s.ReadToEnd();
break;
}
}
}
}
return retVal;
}
public static void SetArchive(String path, String zipName, Dictionary<String, String> files)
{
using (var fileStream = new FileStream(Path.Combine(path, zipName), FileMode.OpenOrCreate))
{
using (ZipArchive zip = new ZipArchive(fileStream, ZipArchiveMode.Create))
{
foreach (KeyValuePair<String, String> file in files)
{
var entry = zip.CreateEntry(file.Key, CompressionLevel.Optimal);
using (Stream s = entry.Open())
{
byte[] data = Encoding.UTF8.GetBytes(file.Value);
s.Write(data, 0, data.Length);
}
}
}
}
}
Chose, c'est que l'archive zip créé et loin de gestionnaire et de WinRAR peut l'ouvrir, mais quand j'utilise la deuxième méthode pour lire son contenu, je reçois des
Nombre d'entrées attendues en Fin De Répertoire Central ne correspond pas au nombre d'entrées dans l'Annuaire.
au Système.IO.La Compression.ZipArchive.ReadCentralDirectory()
au Système.IO.La Compression.ZipArchive.get_Entries()
chez Microsoft.MCS.SPPal.Le stockage.StorageObject.GetFileContent(String zipPath, Chaîne entityName) z:\Home Inc\Microsoft.MCS.SPPal\Microsoft.MCS.SPPal\Stockage\StorageObject.cs:ligne 32
chez Microsoft.MCS.SPPal.MainWindow..ctor() dans z:\Home Inc\Microsoft.MCS.SPPal\Microsoft.MCS.SPPal\MainWindow.xaml.cs:ligne 48
Comme une partie de l'expérience, j'ai créé la nouvelle archive dans far manager, et l'ouvrit avec GetFileContent méthode, et il fonctionne comme un charme. Donc je pense que l'erreur doit être dans SetArchive méthode.
Toute aide serait génial, il est 3 heures du matin et je suis coincé.
P. S: je sais que le code de la conception sucer, il a été réécrit des dizaines de fois.
OriginalL'auteur Silverlay | 2013-04-25
Vous devez vous connecter pour publier un commentaire.
Et appeler une méthode avec: AddToArchive(inFolder, splitIntoDir);
Vous pouvez télécharger le code source de 7zip ici.
Vous pouvez installer un package Nuget pour 7zip ici pour Visual Studio.
Cela n'a pas aider à répondre à la question posée dans le titre.
C'était un de mes premiers posts, ma seule intention était d'aider d'autres solution, mais désolé si ma solution n'est pas aimé par tout le monde.
ce n'est pas de savoir si votre solution est bonne dans son propre droit ou pas, c'est juste inattendu de trouver une réponse à ce sujet 7zip à une question sur ZipArchive.
Je suis d'accord en grande partie avec les autres personnes, et il devrait certainement avoir enlevé les mots "Pour une meilleure compression que vous pouvez utiliser 7zip bibliothèque." Cependant, j'ai beaucoup apprécié l'apprentissage il y avait même cette autre bibliothèque à disposition pour faire la même tâche, une tâche qui s'applique directement à la base de la fonction de demande. Je pense que ce ne doit pas être marqué comme réponse. Je souhaite DONC a peut-être un "auxiliaire de réponse ou de réponse" tag.
OriginalL'auteur Joseph
J'ai pu obtenir que cela fonctionne en ajoutant un appel explicite à l'dispose() sur le ZipArchive avant il est allé hors de portée dans la SetArchive() la méthode.
using (ZipArchive zip = new ZipArchive(...))
ne pas faire son travail?using
blocs sont spécifiquement destinés à être utilisés avec des objets...Bon point. Je n'étais pas à l'aide de "l'aide". En passant à "l'aide" fonctionne très bien aussi.
OP du code a
using
blocs pour tous les produits jetables, n'hésitez pas à éditer votre post et ajouter votre code de travail 🙂OriginalL'auteur Stephen Coy
Lorsque vous essayez d'ouvrir des fichiers zip contenant les fichiers supérieurs à 4 GO avant la compression qui a été compressé à l'aide de Deflate64 (créé via le shell Windows ou 7-zip), j'ai eu
lors de la décompression avec
System.IO.Compression.ZipFile
sur Windows 2012 R2. Ces fichiers semblait être légitime, fermetures, car le Shell Windows, 7-zip et Info-zip peut décompresser. Le seul gros fichier zip les archives décompressé sans erreur avecSystem.IO.Compression.ZipFile
ont été créés avec Info-zip Zip64.OriginalL'auteur Anon