Existe-t-il de toute façon en .Net (C #) pour extraire des données d’un fichier Zip sans décompresser l’ensemble du fichier?
Simplement je veux éventuellement extraire des données (fichier) depuis le début d’un fichier Zip, évidemment cela dépend si l’algorithme de compression compresse le fichier dans un ordre déterministe.
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 simple 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");
}
}
Modifié dans Remarque: DotNetZip vivait chez Codeplex. Codeplex a été arrêté. L'ancienne archive est toujours disponible sur Codeplex . Il semble que le code a migré vers Github:
Avec .Net Framework 4.5 (en 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 lister 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 chaîne (.NET Framework 4.5 et versions supérieures):
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());
Dans ce cas, vous devrez analyser les entrées d'en-tête local Zip. Chaque fichier, stocké dans un fichier Zip, est précédé d’une entrée d’en-tête de fichier local, qui contient (en principe) suffisamment d’informations pour la décompression. fichier et appelez unzip sur cette partie (si vous ne voulez pas vous occuper de tout le code de décompression Zip ou de la bibliothèque).
Les fichiers zip ont une table des matières. Chaque utilitaire Zip doit pouvoir interroger uniquement la table des matières. Vous pouvez également utiliser un programme en ligne de commande tel que 7Zip -t pour imprimer la table des matières et la rediriger vers un fichier texte.