Quelqu'un peut-il me dire pourquoi le code suivant ne fonctionne pas? J'utilise l'API SharpZipLib pour les flux Zip, la dernière version DL'ed aujourd'hui de leur site. Je tente d'utiliser cette logique pour fusionner le contenu d'un fichier zip dans un autre, sans avoir à effectuer d'E/S sur le disque, car les fichiers zip prévus peuvent contenir des noms de fichiers réservés pour Windows. J'ai essayé ceci avec plusieurs différents fichiers zip de source et de destination (ceux qui contiennent des noms réservés et ceux qui ne le font pas). Le code ne lance aucune exception, et si vous inspectez le tampon avant chaque opération d'écriture, vous pouvez voir qu'il contient des données réelles, mais une fois l'opération terminée, la taille du fichier zip cible n'a pas changé et vous pouvez explorer pour confirmer qu'aucun nouveau fichier (ceux que le code est censé ajouter) n'a été ajouté au fichier de destination. :(Extraire les entrées zip dans un autre fichier Zip
public static void CopyToZip(string inArchive, string outArchive)
{
ZipOutputStream outStream = null;
ZipInputStream inStream = null;
try
{
outStream = new ZipOutputStream(File.OpenWrite(outArchive));
outStream.IsStreamOwner = false;
inStream = new ZipInputStream(File.OpenRead(inArchive));
ZipEntry currentEntry = inStream.GetNextEntry();
while (currentEntry != null)
{
byte[] buffer = new byte[1024];
ZipEntry newEntry = new ZipEntry(currentEntry.Name);
newEntry.Size = currentEntry.Size;
newEntry.DateTime = currentEntry.DateTime;
outStream.PutNextEntry(newEntry);
int size = 0;
while ((size = inStream.Read(buffer, 0, buffer.Length)) > 0)
{
outStream.Write(buffer, 0, size);
}
outStream.CloseEntry();
currentEntry = inStream.GetNextEntry();
}
outStream.IsStreamOwner = true;
}
catch (Exception e)
{
throw e;
}
finally
{
try { outStream.Close(); }
catch (Exception ignore) { }
try { inStream.Close(); }
catch (Exception ignore) { }
}
}
J'ai suivi ces exemples pour créer le code que j'ai posté ici. À ce stade, peu importe si elle écrase ou non, le code ci-dessus ne change pas du tout l'état du fichier zip de destination. S'il écrasait, au moins j'aurais quelque chose à déboguer ... Je n'ai pas besoin d'utiliser un flux de memeory. Ce que je veux dire par «sans utiliser le disque» est que je ne peux pas extraire le contenu d'un zip sur le disque dur, puis le remballer dans un autre zip. Il doit passer d'un zip à l'autre sans être déballé sur le disque dur en raison des conventions de nommage des fichiers Windows. –
J'ai utilisé un nouveau FileStream (outArchive, FileMode.Open) à la place de File.OpwnWrite(). Il n'a pas changé le résultat du tout. –