Comment lire les données d'un fichier zip sans avoir à décompresser le fichier entier
y a-t-il de toute façon dans .Net (C#) pour extraire des données d'un fichier zip sans décompresser le fichier complet?
simplement je veux éventuellement extraire des données (fichier) du début d'un fichier zip, évidemment cela dépend si l'algorithme de compression compresse le fichier dans un ordre déterministe.
6 réponses
DotNetZip est votre ami ici.
aussi facile que:
using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
ZipEntry e = zip["MyReport.doc"];
e.Extract(OutputStream);
}
(vous pouvez également extraire vers un fichier ou d'autres destinations).
Lire la table des matières du fichier zip est aussi facile que:
using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
foreach (ZipEntry e in zip)
{
if (header)
{
System.Console.WriteLine("Zipfile: {0}", zip.Name);
if ((zip.Comment != null) && (zip.Comment != ""))
System.Console.WriteLine("Comment: {0}", zip.Comment);
System.Console.WriteLine("\n{1,-22} {2,8} {3,5} {4,8} {5,3} {0}",
"Filename", "Modified", "Size", "Ratio", "Packed", "pw?");
System.Console.WriteLine(new System.String('-', 72));
header = false;
}
System.Console.WriteLine("{1,-22} {2,8} {3,5:F0}% {4,8} {5,3} {0}",
e.FileName,
e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"),
e.UncompressedSize,
e.CompressionRatio,
e.CompressedSize,
(e.UsesEncryption) ? "Y" : "N");
}
}
Édité À Noter: DotNetZip l'habitude de vivre sur Codeplex. Codeplex a été arrêté. L'ancienne archive est toujours disponible au Codeplex . On dirait que le code a migré vers Github:
- https://github.com/DinoChiesa/DotNetZip . On dirait le rapport de l'auteur original.
- https://github.com/haf/DotNetZip.Semverd . Cela semble être la version actuellement mise à jour. Il est également emballé dans un disponible via Nuget à https://www.nuget.org/packages/DotNetZip/
avec .net Framework 4.5 (utilisant ZipArchive ):
using (ZipArchive zip = ZipFile.Open(zipfile, ZipArchiveMode.Read))
foreach (ZipArchiveEntry entry in zip.Entries)
if(entry.Name == "myfile")
entry.ExtractToFile("myfile");
trouvez "myfile" dans zipfile et extrayez-le.
quelque chose comme ceci va énumérer et extraire les fichiers un par un, si vous voulez utiliser SharpZipLib:
var zip = new ZipInputStream(File.OpenRead(@"C:\Users\Javi\Desktop\myzip.zip"));
var filestream = new FileStream(@"C:\Users\Javi\Desktop\myzip.zip", FileMode.Open, FileAccess.Read);
ZipFile zipfile = new ZipFile(filestream);
ZipEntry item;
while ((item = zip.GetNextEntry()) != null)
{
Console.WriteLine(item.Name);
using (StreamReader s = new StreamReader(zipfile.GetInputStream(item)))
{
// stream with the file
Console.WriteLine(s.ReadToEnd());
}
}
basé sur cet exemple: contenu dans le fichier zip
Voici comment un fichier texte UTF8 peut être lu à partir d'une archive zip dans une variable string (.net Framework 4.5 et plus):
string zipFileFullPath = "{{TypeYourZipFileFullPathHere}}";
string targetFileName = "{{TypeYourTargetFileNameHere}}";
string text = new string(
(new System.IO.StreamReader(
System.IO.Compression.ZipFile.OpenRead(zipFileFullPath)
.Entries.Where(x => x.Name.Equals(targetFileName,
StringComparison.InvariantCulture))
.FirstOrDefault()
.Open(), Encoding.UTF8)
.ReadToEnd())
.ToArray());
ont une table des matières. Chaque utilitaire zip devrait avoir la possibilité d'interroger seulement le TOC. Vous pouvez aussi utiliser un programme en ligne de commande comme 7zip-t pour imprimer la table des matières et la rediriger vers un fichier texte.
dans ce cas, vous devrez analyser les entrées en-tête zip local. Chaque fichier, stocké dans le fichier zip, a précédé l'en-tête du fichier Local, qui (normalement) contient assez d'informations pour la décompression, généralement, vous pouvez faire simple analyse de ces entrées dans le flux, sélectionner le fichier nécessaire, copier l'en-tête + données de fichier compressé à l'autre fichier, et appeler unzip sur cette partie (si vous ne voulez pas traiter l'ensemble du code de décompression Zip ou de la bibliothèque).