J'utilise Ionic.Zip pour extraire ZipFile dans un flux de mémoire avec cette méthode:
private MemoryStream GetReplayZipMemoryStream()
{
MemoryStream zipMs = new MemoryStream();
using (ZipFile Zip = ZipFile.Read(myFile.Zip))
{
foreach (ZipEntry zipEntry in Zip)
{
if (zipEntry.FileName.StartsWith("Aligning") || zipEntry.FileName.StartsWith("Sensing"))
{
zipEntry.Extract(zipMs);
}
}
}
zipMs.Seek(0, SeekOrigin.Begin);
return zipMs;
}
Une fois l'extraction terminée, je souhaite lire les flux et obtenir certaines des entrées en fonction du nom de fichier. Comment puis je faire ça?
J'ai essayé en appelant avec le code ci-dessous, mais je reçois une erreur sur le ZipFile.Read(ms)
qui disait:
Impossible de lire cela comme un ZipFile
Stream ms = GetReplayZipMemoryStream();
using (ZipFile Zip = ZipFile.Read(ms))
{
ZipEntry imageEntry = Zip.Entries.First(x => x.FileName.EndsWith(".png"));
using (Stream s = imageEntry.OpenReader())
{
var image = Image.FromStream(s);
pictureBox1.Image = image;
}
}
Merci d'avance pour votre aide!
C'est peut-être une question un peu ancienne et une réponse tardive, mais j'ai fait quelque chose pour obtenir les fichiers sous forme de collections d'octets et leurs noms de fichier comme celui-ci.
public static Dictionary<string, byte[]> Decompress(Stream targFileStream)
{
Dictionary<string, byte[]> files = new Dictionary<string, byte[]>();
using(ZipFile z = ZipFile.Read(targFileStream))
{
foreach (ZipEntry zEntry in z)
{
MemoryStream tempS = new MemoryStream();
zEntry.Extract(tempS);
files.Add(zEntry.FileName, tempS.ToArray());
}
}
return files;
}
@ HenkHolerman a raison, vous n'avez plus de fichier Zip à ce stade. Vous voudrez peut-être envisager d'extraire le contenu du fichier Zip dans un répertoire temporaire, puis de l'exploiter sur les fichiers image via le système de fichiers.