SevenZipExtractor (Password)

Iniciado por rigorvzla, 29 Mayo 2018, 01:40 AM

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

rigorvzla

Hola amigos, hoy les traigo una inquietud y consulta , actualmente uso la libreria SevenZip para comprimir y descomprimir archivos, eh realizado trabajos interesantes con ella y me han quedado bien (comprimir / descomprimir), ahora tengo una inquietud y es, que al descomprimir archivos con contraseña me da un error, lo que necesito es saber , como puedo validar un archivo que, en caso de tener contraseña lo compare con un textbox y en caso de no tener contraseña seguir su proceso normal como ya lo hace.

mi codigo actual esta asi

Código (csharp) [Seleccionar]
public void metodoExtraccion()
       {
           AvisoDescargas des = new AvisoDescargas();
           des.listaDescargas.Visibility = System.Windows.Visibility.Visible;
           des.lblDescargaTitulo.Content = "EXTRAYENDO ARCHIVOS";
           des.Show();

           Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog
           {
               Title = "Archivos a Descomprimir",
               Filter = "Extraer (7z RAR Zip ISO|*.7z; *.rar; *.zip; *.iso",
               Multiselect = true
           };
           if ((ofd.ShowDialog() == true))
           {
               StreamWriter sw = new StreamWriter("listfile.lst");
               foreach (string n in ofd.FileNames)
               {
                   sw.WriteLine(n);
               }
               sw.Close();

               string zipName = ofd.FileName;

               System.Threading.Tasks.Task.Run(() => {
                   using (var tmp = new SevenZipExtractor(
                       
                   File.OpenRead(zipName)))
                   {
                       
                       tmp.FileExtractionStarted += (s, e) =>
                       {
                           Dispatcher.Invoke(() => des.listaDescargas.Items.Add((String.Format("Extrayendo... [{0}%] {1}", e.PercentDone, e.FileInfo.FileName))));
                           
                       };
                       tmp.ExtractionFinished += (s, e) => { Dispatcher.Invoke(() => des.listaDescargas.Items.Add("Proceso Finalizado")); };
                       try
                       {
                           Directory.CreateDirectory(ofd.SafeFileName);
                           string nombre = Path.GetFileNameWithoutExtension(ofd.SafeFileName);
                           string salida = Path.Combine(Settings.Default.directorioExtraidos, nombre);
                           tmp.ExtractArchive(salida);
                           MainWindow.habla.SpeakAsync("Extraccion Finalizada");
                           Directory.Delete(ofd.SafeFileName, true);
                       }
                       catch (Exception)
                       {
                           des.lblPorcentaje.Content = "Necesita Contraseña";
                           MainWindow.habla.Speak("No se puede extraer, archivo dañado o con contraseña");
                       }
                       
                   }
               });
           };
       }


El codigo es totalmente funcional, espero puedan ayudarme con un ejemplo con validacion de contraseña y de ahi partir a adaptarlo a mi codigo , gracias de antemano.

MCKSys Argentina

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


rigorvzla

si, ya eh visto eso y veo que ahi esta la respuesta, mas no la entiendo si podrias expplicarmelo como a bebe mongolico seria perfecto y disculpa la molestia

Eleкtro

#3
Tan solo tienes que usar la sobrecarga del constructor de la clase SevenZipExtractor, la cual toma una contraseña como segundo parámetro.




Por cierto, esto es completamente inapropiado (mal hábito de programación):
Citar(ofd.ShowDialog() == true)

El valor de retorno no es booleano, sino un valor de la enumeración DialogResult...

Lo que estás haciendo con ese casting booleano en realidad es: (ofd.ShowDialog() != DialogResult.None); en este caso debería ser: (ofd.ShowDialog() == DialogResult.Ok). Piensa de lo contrario que ocurrirá con dialogos de más botones cuyo valor de retorno no consista solamente en DialogResult.Cancel y DialogResult.Ok...

Y en la linea de File.OpenRead(zipName))) en ningún momento estás asignando una referencia del stream (el valor de retorno de dicha función) para luego liberarlo mediante el método Close o Dispose, por lo tanto no vas a poder manipular/leer esos archivos abiertos por tu programa desde fuera del programa... puesto que están siendo abiertos en modo lectura de forma "permanente" por tu programa (hasta que finalice la terminación del programa).

Saludos.








rigorvzla

muchisimas gracias elektro por tu observacion, ya corregi y aprendi lo del dialogresult , cosa que tenia mala en todo el proyecto , pero tenia uno bien planteado mas no sabia por que me daba error, y era por la referencia que era win32 y no form.

Punto dos : no se como reparar lo del FileRead

Punto tres: este el mas importante y el inicio del post, podrias darme un ejemplo para poderme guiar es que no se en que parte del codigo pasar el parametro ya que lo que eh intentado hasta ahora me genera error.

Gracias nuevamente, por que me toco colocar como dices tu 2 botones y acciones diferentes en el fileDialog y a pesar que me percate y repare eso, crei que bastaba con colocarlo true, pero veo que , no es malo, es incorrecto, la idea es decir que hacer y no dejarlo sobre entenido, corrigeme si me equivoco .

Encontre este ejemplo pero no se como hacerlo util a mi caso
http://csharpexamples.com/zip-and-unzip-files-programmatically-in-c/

Eleкtro

#5
Cita de: rigorvzla en 29 Mayo 2018, 12:54 PMPunto dos : no se como reparar lo del FileRead

En realidad si que sabes pero te cuesta darte cuenta, o al menos se supone que sabes, puesto que aparentas saber utilizar la instrucción using en otras partes del código...


Si no tienes claro qué hacer, entonces tienes que leer y estudiar lo que explican en ese artículo, y leer sobre la interfaz IDisposable y el método IDisposable.Dispose...




Cita de: rigorvzla en 29 Mayo 2018, 12:54 PM
Punto tres: este el mas importante y el inicio del post, podrias darme un ejemplo para poderme guiar es que no se en que parte del codigo pasar el parametro ya que lo que eh intentado hasta ahora me genera error.

Con lo que te expliqué debería ser más que suficiente:
Cita de: ElektroTan solo tienes que usar la sobrecarga del constructor de la clase SevenZipExtractor, la cual toma una contraseña como segundo parámetro.

...ahí te estoy indicando donde tienes que pasarle el parámetro: al constructor de la clase SevenZipExtractor. Concretamente aquí:

Código (csharp) [Seleccionar]
using (var tmp = new SevenZipExtractor( FileStream, "contraseña" ) {
   ...
}





Cita de: rigorvzla en 29 Mayo 2018, 12:54 PMme toco colocar como dices tu 2 botones y acciones diferentes en el fileDialog y a pesar que me percate y repare eso, crei que bastaba con colocarlo true, pero veo que , no es malo, es incorrecto, la idea es decir que hacer y no dejarlo sobre entenido, corrigeme si me equivoco .

Hmmm... no entiendo a lo que te refieres con "la idea es decir que hacer y no dejarlo sobre entenido, corrigeme si me equivoco", pero lo que te intento decir es facil de comprender si conoces lo básico del lenguaje, al menos si conoces los tipos primitivos y comprendes sus diferencias...

La enumeración DialogResult consta de 8 valores enteros, del 0 al 7:

Código (csharp) [Seleccionar]
namespace System.Windows.Forms {

   [ComVisible(true)]
   public enum DialogResult {
       None = 0,
       OK = 1,
       Cancel = 2,
       Abort = 3,
       Retry = 4,
       Ignore = 5,
       Yes = 6,
       No = 7
   }

}


El problema es que cuando conviertes cualquierera de esos valores al tipo primitivo boolean se toman todos como true, exceptuando el 0 (None), que equivale a false...

Por si no ha quedado claro... en tu código haces esto:
Citarif (ofd.ShowDialog() == true)
...pero eso siempre te va a devovler true, por que la función OpenFileDialog.ShowDialog muestra una ventana de diálogo de dos botones que solo puede devolver DialogResult.OK (1) y DialogResult.Cancel (2), y ambos valores equivalen a true.

En la propia descripción del miembro lo dice claramente:
Cita de: Visual Studio - Object InspectorReturns: System.Windows.Forms.DialogResult.OK if the user clicks OK in the dialog box; otherwise, System.Windows.Forms.DialogResult.Cancel.

Saludos.








rigorvzla

si claro , todo lo entendi , gracias por el ejemplo, entendi a la perfeccion lo de filedialog y mas claro aun por la explicacion, me tocara leer esa respuesta al FileReader porque como dices aun no lo veo, eso me aclarara la vista.

Nuevamente gracias por la ayuda.

PD. En ocasiones no entiendo a la primera lo que explicas pero luego de un tiempo y de haber estudiado mas, regreso a leer con calma y la solucion era mas que evidente hasta util para otros propositos. Gracias por la paciencia . Feliz Dia!


rigorvzla

#7
disculpen edito esto por no saber como eliminar el comentario, ya resolvi el problema  MUCHAS gracias!