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
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...
CitarCódigo (csharp) [Seleccionar]File.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:
CitarCódigo (csharp) [Seleccionar]tmp.CompressDirectory(folderToZip, @"test.7z");
sin embargo, tú le estás intentando pasar un stream como argumento:
Citar(y además, aparte de eso, como ya habiamos explicado, aparentemente intentas pasarle la ruta de un directorio al método File.Create)Código (csharp) [Seleccionar]tmp.CompressDirectory(folderToZip, File.Create(Settings.Default.directorioComprimidos));
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:
Código (csharp) [Seleccionar]
// ...
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:
Código (csharp) [Seleccionar]
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!