Cuando le paso una carpeta me lo hace bien pero cuando le paso varias carpetas de un directorio entero, o me guarda todos los ficheros sin guardarme la estructura de carpetas, o sólo me guarda la primera carpeta. No sé qué hago mal, por favor alguien podría ayudarme??? Os dejo dos procedimientos que he hecho.
//con esta opcion solo me comprime una carpeta
public void comprimirDirectorio(string directorio)
{
ZipOutputStream zipFile = null;
try
{
foreach (string dir in Directory.GetDirectories(directorio))
{
//aquí hay que asignarle el nombre que queremos que tenga el fichero comprimido
if (!File.Exists(@"C:\SDS\Modulos Enviados\ModificacionesRecientes.zip"))
{
zipFile = new ZipOutputStream(File.Create(@"C:\SDS\Modulos Enviados\ModificacionesRecientes.zip"));
zipFile.SetLevel(9); //max compression
}
List<string> files = new List<string>(Directory.GetFiles(dir));
foreach (string file in files)
{
byte[] buffer = new byte[4096];
List<string> dirSplit = new List<string>(dir.Split(@"\".ToCharArray()));
List<string> fileSplit = new List<string>(file.Split(@"\".ToCharArray()));
ZipEntry entry = new ZipEntry(dirSplit[dirSplit.Count - 1] + @"\" + fileSplit[fileSplit.Count - 1]);
entry.DateTime = DateTime.Now;
zipFile.PutNextEntry(entry);
FileStream fs = null;
try
{
fs = File.OpenRead(file);
int bytes = 1;
while (bytes > 0)
{
bytes = fs.Read(buffer, 0, buffer.Length);
zipFile.Write(buffer, 0, bytes);
}
}
catch
{
}
finally
{
if (fs != null)
{
fs.Close();
}
}
}
}
}
catch
{
}
finally
{
if (zipFile != null)
{
zipFile.Finish();
zipFile.Close();
}
}
}
//*****************************************************************
//con esta opción me comprime todos los archivos del directorio pero pierde toda la estructura de las carpetas
public void CompressDirectory(string directorio, ZipOutputStream zip)
{
zip.SetLevel(9);
foreach (string file in Directory.GetFiles(directorio))
WriteToZip(file, file.Replace(directorio, null), zip);
}
//*******************************************************************
static void WriteToZip(string file, string entrypath, ZipOutputStream zip)
{
ZipEntry entry = new ZipEntry(entrypath);
entry.DateTime = DateTime.Now;
zip.PutNextEntry(entry);
if (!string.IsNullOrEmpty(file))
{
using (FileStream fs = File.OpenRead(file))
{
byte[] buffer = new byte[4096];
int bytes = 1;
while (bytes > 0)
{
bytes = fs.Read(buffer, 0, buffer.Length);
zip.Write(buffer, 0, bytes);
}
}
}
}
alguien puede ayudarme?????? muchas gracias a todos.







