Buenas noches amigos, eh estado trabajando con la libreria SevenZip y me ah resultado tremenda, cree mi proyecto para probar el codigo aparte y me funciono de maravilla pero a la hora de aplicarlo a mi codigo base me da un error que no le encuentro razon de ser y me gustaria otras opiniones.
Este es el codigo de mi proyecto independiente.
public void sevenZipCompresorD()
{
System.Threading.Tasks.Task.Run(() =>
{
System.Windows.Forms.FolderBrowserDialog ofd = new System.Windows.Forms.FolderBrowserDialog();
ofd.Description = "Seleccione la carpeta a comprimir";
ofd.RootFolder = Environment.SpecialFolder.Desktop;
Dispatcher.Invoke(() =>
{
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
string folderToZip = ofd.SelectedPath;
System.Threading.Tasks.Task.Run(() =>
{
var tmp = new SevenZipCompressor();
tmp.ArchiveFormat = OutArchiveFormat.SevenZip;
tmp.CompressionMethod = CompressionMethod.Lzma;
tmp.CompressionLevel = CompressionLevel.Ultra;
tmp.FileCompressionStarted += (s, e) =>
{
Dispatcher.Invoke(() => lblPorcentage.Content = (String.Format("Comprimiendo... [{0}%] {1}",
e.PercentDone, e.FileName)));
};
tmp.CompressionFinished += (s, e) => { Dispatcher.Invoke(() => lblPorcentage.Content = ("Finished!")); };
tmp.CompressDirectory(folderToZip, @"test.7z");
});
}
});
});
}
private void SevenZipCompresorA()
{
System.Threading.Tasks.Task.Run(() =>
{
Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
ofd.Title = "Archivos a Comprimir";
ofd.Filter = "Archivos a Comprimir|*.*";
ofd.Multiselect = true;
if ((ofd.ShowDialog() == true))
{
//StreamWriter sw = new StreamWriter("listfile.lst");
//foreach (string n in ofd.FileNames)
//{
// sw.WriteLine(n);
//}
//sw.Close();
System.Threading.Tasks.Task.Run(() =>
{
var tmp = new SevenZipCompressor();
tmp.ArchiveFormat = OutArchiveFormat.SevenZip;
tmp.CompressionMethod = CompressionMethod.Lzma;
tmp.CompressionLevel = CompressionLevel.Ultra;
tmp.FileCompressionStarted += (s, e) =>
{
Dispatcher.Invoke(() => lblPorcentage.Content = (String.Format("Comprimiendo... [{0}%] {1}",
e.PercentDone, e.FileName)));
};
tmp.CompressionFinished += (s, e) => { Dispatcher.Invoke(() => lblPorcentage.Content = ("Finished!")); };
tmp.CompressFiles(@"test.7z", ofd.FileName);
});
}
});
}
Aclaro ambos funcionan de manera exitosa y pueden probarlo.
este es el codigo de mi proyecto base.
public void metodoDirectorio()
{
SpeechSynthesizer habla = new SpeechSynthesizer();
AvisoVisual aviso = new AvisoVisual();
aviso.Top = 1;
aviso.Left = 600;
aviso.Visibility = Visibility.Visible;
System.Threading.Tasks.Task.Run(() =>
{
System.Windows.Forms.FolderBrowserDialog ofd = new System.Windows.Forms.FolderBrowserDialog();
ofd.Description = "Seleccione la carpeta a comprimir";
ofd.RootFolder = Environment.SpecialFolder.Desktop;
Dispatcher.Invoke(() =>
{
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
string folderToZip = ofd.SelectedPath;
System.Threading.Tasks.Task.Run(() =>
{
var tmp = new SevenZipCompressor();
tmp.ArchiveFormat = OutArchiveFormat.SevenZip;
tmp.CompressionMethod = CompressionMethod.Lzma;
tmp.CompressionLevel = CompressionLevel.Ultra;
tmp.FileCompressionStarted += (s, e) =>
{
Dispatcher.Invoke(() => aviso.Content = (String.Format("Comprimiendo... [{0}%] {1}",
e.PercentDone, e.FileName)));
};
tmp.CompressionFinished += (s, e) => Dispatcher.Invoke(() => aviso.Close());
tmp.CompressDirectory(folderToZip, File.Create(Settings.Default.directorioComprimidos));
});
}
else
{
aviso.Close();
}
});
});
}
public void metodoArchivo()
{
AvisoVisual aviso = new AvisoVisual();
aviso.Top = 1;
aviso.Left = 600;
aviso.Visibility = Visibility.Visible;
System.Threading.Tasks.Task.Run(() =>
{
Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
ofd.Title = "Archivos a Comprimir";
ofd.Filter = "Archivos a Comprimir|*.*";
ofd.Multiselect = true;
if ((ofd.ShowDialog() == true))
{
System.Threading.Tasks.Task.Run(() =>
{
var tmp = new SevenZipCompressor();
tmp.ArchiveFormat = OutArchiveFormat.SevenZip;
tmp.CompressionMethod = CompressionMethod.Lzma;
tmp.CompressionLevel = CompressionLevel.Ultra;
tmp.FileCompressionStarted += (s, e) =>
{
Dispatcher.Invoke(() => aviso.Content = (String.Format("Comprimiendo... [{0}%] {1}",
e.PercentDone, e.FileName)));
};
tmp.CompressionFinished += (s, e) => { Dispatcher.Invoke(() => aviso.Close()); };
tmp.CompressFiles(Settings.Default.directorioComprimidos, ofd.FileName);
});
}
else
{
Dispatcher.Invoke(() => aviso.Close());
}
});
}
como se podran fijar la unica diferencia es el cambio de direccion en la parte de salida del archivo.
El error del codigo 2 es: "acceso denegado a la ruta de acceso 'C:\'.' en realidad a la ruta que le ponga da ese error y no enteindo ni se por que, espero pueda alguien ayudarme.
PD. Despues de buscar solucion ahora me envia el archivo a el lugar que quiera pero sin nombre alguno y eso asigno un nombre.
Cita de: rigorvzla en 29 Marzo 2018, 05:21 AMeh estado trabajando con la libreria SevenZip
No existe ninguna librería para .NET que se llame así, el nombre al que te refieres en realidad es
SevenZipSharp, un wrapper de la librería de
SevenZip (C/C++).
Cita de: rigorvzla en 29 Marzo 2018, 05:21 AMy me ah resultado tremenda
Bueno, a modo de advertencia te digo: deberías tener en cuenta que estás utilizando una librería obsoleta, siendo la última actualización del año 2012, y aparte, por experiencia en su utilización durante varios años (dejé de usarla hace ya tiempo) te puedo decir que esa librería está llena de bugs conocidos que nunca fueron corregidos por el autor, y limitaciones/características que no son del todo soportadas.
De todas formas siempre es mucho mejor recurrir a la libreria de
SevenZipSharp que ponerse a desarrollar un algoritmo de compresión basado en la ejecución de
7zip.exe, pero mejor todavía sería que implementases tu propio wrapper de la librería
7zip.dll para cumplir tus necesidades (puedes tomar como ejemplo todo el P/Invoking de la librería de
SevenZipSharp ).
Para operaciones de compresión muy puntuales siempre viene bien
SevenZipSharp, cumple su función, al igual que lo hace la librería
DotNetZip, pero si buscas algo más actualizado y desarrollado por grandes programadores (los mismos que desarrollaron la IDE '
SharpDevelop') entonces quizás quieras plantearte olvidar esas librerías y empezar a utilizar
SharpZipLib en su lugar: https://github.com/icsharpcode/SharpZipLib (https://github.com/icsharpcode/SharpZipLib)
Con respecto al error que tienes, si por el nombre de la propiedad "directorioComprimidos" debemos asumir que a dicha propiedad le estás asignando la ruta de un directorio (ej. "C:\") entonces creo que es algo evidente donde, cual, y por qué motivo estás teniendo un error...
CitarFile.Create(Settings.Default.directorioComprimidos)
El método
File.Create(), como su propio nombre indica por si mismo tiene el propósito de crear archivos, no directorios; para eso utiliza el método
Directory.Create(). Cuando le pasas la ruta de un directorio existente al método
File.Create(), salta la misma excepción que ya has mencionado.
Aparte de eso, en el código original que has mostrado, el método
CompressDirectory() tiene especificado como segundo argumento un nombre de archivo, un argumento de tipo
string:
Citartmp.CompressDirectory(folderToZip, @"test.7z");
sin embargo, tú le estás intentando pasar un
stream como argumento:
Citartmp.CompressDirectory(folderToZip, File.Create(Settings.Default.directorioComprimidos));
(y además, aparte de eso, como ya habiamos explicado, aparentemente intentas pasarle la ruta de un directorio al método
File.Create)
Si eso que estás intentando hacer no te genera un error en tiempo de compilación entonces perfecto, significará que existe una sobrecarga del método
CompressDirectory la cual si acepta un stream como argumento, yo hace mucho que no utilizo
SevenZipSharp así que ahora mismo no recuerdo ese detalle, pero sin embargo sigue habiendo un problema de todas formas, y es que no te estás asegurando de
liberar el stream, y eso es malo,
muy malo, por que te estarías dejando abierto el controlador del archivo que creases, y con ello te estarías auto-impidiendo el acceso de lectura y escritura a ese archivo en tu propia aplicación... ya que no te guardas la referencia en ningún lado para poder manipular el stream.
para evitar que eso suceda, debes utilizar la directiva
using:
// ...
using (FileStream fs = File.Create(@"C:\File.7z")) {
tmp.CompressDirectory(folderToZip, fs);
}
// ...
...o en su defecto llamar al método
FileStream.Close() en la referencia del objeto devuelto:
FileStream fs = File.Create(@"C:\File.bin");
tmp.CompressDirectory(folderToZip, fs);
fs.Close();
Por último déjame darte un consejo general: cuando trabajes con clases que no hayas usado antes, o clases con las que no tengas mucha experiencia, comprueba siempre si expone un método con nombre 'Close' o 'Dispose', y si lo tiene entonces sigue el ejemplo de uso que te acabo de indicar, ya que se trata de una clase que implementa la interfáz
IDisposable, y esto significa que la instancia de dicha clase genera recursos no administrados que deben liberarse (aunque no todas las clases que implementan IDisposable requieren estrictamente que llames al méttodo Dispose, pero mejor hacerlo), de lo contrario ocurren problemas, en algunas ocasiones son problemas graves (como este, no liberar el handle/controlador de un archivo), y en otras ocasiones causan "simples" fugas de memoria...
Saludos!
gracias elektro, correccion uso es "SevenZipSharp" me acabo de serciorar y es la ultima actualmente... solucione el asunto pero aun hay unos extraños, resulta que los metodos de comprimir no me los dirige a donde yo pido , pero si los comprime en la misma carpeta y con el nombre que tiene el archivo, esto es algo bueno a pesar que no lo planeaba asi, y el de comprimir si esta bien osea donde yo pido se descomprime... el unico detalle es q no crea un subdirectorio y complica un poco las cosas por que esparece los archivos por donde esta, este detalle si seria bueno que me indicaras por que ni idea y eso que busque... por cierto gracias nuevamente elektro por que ya hoy dia entiendo el primer post que hice y en el cual me ayudaste.
Mas en ese momento no entendi
Cita de: rigorvzla en 29 Marzo 2018, 08:07 AM
el unico detalle es q no crea un subdirectorio y complica un poco las cosas por que esparece los archivos por donde esta, este detalle si seria bueno que me indicaras por que ni idea y eso que busque...
disculpa pero no comprendo muy bien esto a que te refieres con: "esparece los archivos por donde esta"
Antes de iniciar la operación de compresión, siempre puedes crear tú el subdirectorio de destino con el método que te indiqué:
Directory.CreateDirectory(), ¿eso no te sirve para solucionar el problema que tengas?.
Gracias me pondrea ello, esta madrugada la falta de sueño no me ayudaba a organizar las ideas jaja