SevenZip Acceso Denegado

Iniciado por rigorvzla, 29 Marzo 2018, 05:21 AM

0 Miembros y 1 Visitante están viendo este tema.

rigorvzla

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.
Código (csharp) [Seleccionar]

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.
Código (csharp) [Seleccionar]

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.

Eleкtro

#1
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...

Citar
Có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:
Citar
Código (csharp) [Seleccionar]
tmp.CompressDirectory(folderToZip, @"test.7z");

sin embargo, tú le estás intentando pasar un stream como argumento:
Citar
Código (csharp) [Seleccionar]
tmp.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:
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!








rigorvzla

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

Eleкtro

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?.









rigorvzla

Gracias me pondrea  ello, esta madrugada la falta de sueño no me ayudaba a organizar las ideas jaja