elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  7-ZIp
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 [3] Ir Abajo Respuesta Imprimir
Autor Tema: 7-ZIp  (Leído 20,901 veces)
rigorvzla

Desconectado Desconectado

Mensajes: 221


Ver Perfil
Re: 7-ZIp
« Respuesta #20 en: 26 Noviembre 2017, 21:32 pm »

Eh realizado todos sus pasos agregue las referencias repare el error que daba en path, todo esta segun en orden no supe o no pude no se por que no podia hacer un using de esas dos dll nuevas pero ahi estan en referencia
que falta ¿?
por que el " OK " dice que falta alguna referencia de ensamblado. les anexo la imagen espero se vea bien
re edito no salio bien





disculpen si sale varias veces es que la puse de varias maneras por que no se como es la opcion correcta. disculpen nuevamete

[MOD] corregido tu error.....


« Última modificación: 26 Noviembre 2017, 21:48 pm por simorg » En línea

rigorvzla

Desconectado Desconectado

Mensajes: 221


Ver Perfil
Re: 7-ZIp
« Respuesta #21 en: 26 Noviembre 2017, 23:39 pm »

Lo más apropiado para obtener un control absoluto y eficiente sobre el procedimiento de compresión y descompresión de 7-Zip sería que implementases las funciones exportadas en la librería 7za.dll mediante Platform Invoking, puedes ver un ejemplo ya hecho aquí:

....entiendo que esto es mucho pedir ya que estás empezando en .NET y desconoces muchos conceptos todavía, así que descartamos esa opción, pero sería preferible que en lugar de lo que estás haciendo actualmente llamando al executable 7za.exe sin más, en lugar de eso al menos utilizases la librería SevenZipSharp (a pesar de que esté bastante desactualizada), ya que al menos proporciona un modo mucho más seguro y sofisticado de control mediante su estructuración de código orientado a eventos, esto te permimtiría controlar facilmente el progreso de compresión/descompresión y cualquier error suscribiéndote al evento correspondiente, además de ofrecer la gran ventaja de poder usar enumeraciones y tipos/clases que representan las diversas funcionalidades de 7-Zip y todos esos parámetros que le pasas por command-line al executable 7za.exe.

Pero bueno, ya que en lugar de eso te has decidido por simplemente iniciar un executable externo sin más, entonces intenta hacerlo lo mejor posible, yo te sugiero crear un simple (muy simple) wrapper de 7za.exe a modo de función que se encargue de ejecutar el executable 7za.exe y al menos devolver el código de salida del proceso.

Aquí abajo te dejo un ejemplo que escribí. Nótese que el código lleva hard-coded la ubicación del executable 7za.exe y los parámetros command-line ("a -t7z -mx=9" etc) ...y más cosas. Se puede extender y perfeccionar el código para hacerlo todo más accesible a través de una clase que exponga propiedades para configurar el nivel de compresión, tipo de compresión, tamaño de diccionario, etcétera, pero eso requeriría definir toda clase de miembros entre enumeraciones, métodos/funciones y tipos, todo ello con su respectiva documentación XML lo que en general agrandaría mucho el código (miles de lineas, así son a veces los códigos que suelo publicar por el foro xD), pero no es plan ni de ponerme a reinventar la rueda (me refiero, existiendo la implementación de SevenZipSharp) ni tampoco es plan de extender más de lo necesario un sencillo ejemplo de código que simplemente funcione para resolverte una duda.

También cabe mencionar que al código le faltaría la capacidad de capturar e imprimir el búfer estándar de salida y el de error para así poder controlar el progreso/porcentaje de compresión y posibles errores por parte de (7za.exe), pero bueno, lo dejo así ya que el hecho de implementar el análisis de datos de los streams (el data parsing del std-out y std-err del proceso) sería mucho trabajo de más, y con esto ya considero más que suficiente para que puedas solucionar el problema que tienes...

En fin, aquí lo tienes:
Código
  1. // int result = CompressFile(@"C:\Filename.ext");
  2. static public int CompressFile(string srcFilePath) {
  3.  
  4.    if (!File.Exists(srcFilePath)) {
  5.        throw new FileNotFoundException(new FileNotFoundException().Message, srcFilePath);
  6.    }
  7.  
  8.    string dstFilePath = Path.Combine(Path.GetDirectoryName(srcFilePath), Path.GetFileName(srcFilePath) + ".7z");
  9.    if (File.Exists(dstFilePath)) {
  10.        // Ignore and let 7za.exe replace/update the target file, or handle the file conflict scenario...
  11.        // throw new NotImplementedException("File conflict error-handling not implemented.");
  12.    }
  13.  
  14.    ProcessStartInfo startinfo = new ProcessStartInfo {
  15.        FileName = "7za.exe",
  16.        WorkingDirectory = @".\",
  17.        Arguments = string.Format("a -t7z -mx=9 -mmt=on -ms=on \"{0}\" \"{1}\"", dstFilePath, srcFilePath),
  18.        CreateNoWindow = true,
  19.        ErrorDialog = true,
  20.        ErrorDialogParentHandle = IntPtr.Zero,
  21.        RedirectStandardError = false,
  22.        RedirectStandardInput = false,
  23.        RedirectStandardOutput = false,
  24.        UseShellExecute = false,
  25.        WindowStyle = ProcessWindowStyle.Hidden
  26.    };
  27.  
  28.    string full7zPath = Path.Combine(startinfo.WorkingDirectory, startinfo.FileName);
  29.    if (!File.Exists(full7zPath)) {
  30.        throw new FileNotFoundException(new FileNotFoundException().Message, full7zPath);
  31.    }
  32.  
  33.    using (Process p = new Process()) {
  34.        p.StartInfo = startinfo;
  35.        p.EnableRaisingEvents = false;
  36.  
  37.        p.Start();
  38.        p.PriorityClass = ProcessPriorityClass.AboveNormal;
  39.        p.WaitForExit(Timeout.Infinite);
  40.  
  41.        return p.ExitCode;
  42.    }
  43.  
  44. }

Código
  1. // int result = await CompressFileAsync(@"C:\Filename.ext");
  2. static public async Task<int> CompressFileAsync(string srcFilePath) {
  3.    Task<int> t = Task.Factory.StartNew<int>(() => Compress(srcFilePath));
  4.    return await t;
  5. }

Modo de empleo sincrónico:
Código
  1. int result = CompressFile(@"C:\Filename.ext");

Modo de empleo asincrónico:
Código
  1. int result = await CompressFileAsync(@"C:\Filename.ext");

Si no entiendes algo del código, pregunta sin problemas. Si no entiendes los comentarios que puse en Inglés (como ya dijiste en otro comentario no te llevas bien con el Inglés)... bueno, lo siento pero yo no programo en Castellano, el Inglés es un requisito fundamental de la programación nos guste o no.

Saludos.
Ya entiendo y con gran razon tu molestia @elektro , eh leido con detalle toda la explicacion que diste y la veo mas clara que antes, incluso coloque el codigo en el proyecto, mas no se como llamarlo para ejecutarlo, me disculpo por haber sido incompetente y hablar antes de analizar (me excusare diciendo " por falta de conocimiento"), y en efecto hay soluciones a mi problema , es cosa ahora de implementarlo, antes a esto di una duda al respecto por q algo y no se q , falta, en fin no dejare de dar gracias por todo esto incluso por mi mala actitud ante una solucion que no entendia,estas cosas son parte del crecer, quizas sea ya tarde pero en compensacion ofrezco mis conocimientos ( no en informatica jeje). soy prepardor fisico,  medico integral entre otras cosas.


En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: 7-ZIp
« Respuesta #22 en: 27 Noviembre 2017, 08:03 am »

Para agregar referencia de las dlls

1.  Abre el menú 'PROYECTO' y luego haz clic sobre 'Agregar Referencia'

2. Dale al botón '[Examinar]' que aparece abajo del cuadro junto a [Aceptar] y [Cancelar].

3. Dirígete al directorio C:\Windows\system32\ y ahí están los dll mencionados:

c:\windows\system32\shdocvw.dll
c:\windows\system32\shell32.dll


4. Seleccionas el DLL y pulsas [Agregar]


Con este código (que ya puse antes) obtienes el directorio seleccionado desde el explorer.exe. de Windows.

Código
  1. SHDocVw.ShellWindows objShellWindows = new SHDocVw.ShellWindows();
  2.            try
  3.            {
  4.                foreach (SHDocVw.InternetExplorer Explorer in objShellWindows)
  5.                {
  6.                    Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)Explorer.Document).SelectedItems();
  7.                    foreach (Shell32.FolderItem item in items)
  8.                    {
  9.                       textBox1.Text= item.Path;
  10.                    }
  11.                }
  12.            }
  13.            catch (Exception ex)
  14.            {
  15.                ex.Source = null;
  16.            }
  17.            return null;
  18.  

Creas un objeto Timer, le estableces la propiedad "Enabled" a True, para que esté en funcionamiento de lo contrario no hade nada. Y le metes ese código


Si te fijas en el código, en este caso,  el directorio obtenido es ingresado en un objeto TextBox.
Código:
textBox1.Text= item.Path;

Por lo tanto tienes que creas un objeto TextBox para visualizar el directorio.

Obvio es un ejemplo que debes adaptar a tu código y meter el 'path' en una variable para luego usarlo en el código de compresión. Te recomiendo probarlo en un proyecto aparte y una vez sepas como funciona lo aplicas a tu programa.

O sea, esto es un snippet, un código de ejemplo, un código ya hecho pero que se debe adaptar a tu programa.

Lo explico.:
Código:
       try
            {
    
            }
            catch (Exception ex)
            {
                ex.Source = null;
            }

Es un control de errores o excepción en jerga informática.  Si se produjera un error pasaría a la parte:
Código:
   catch (Exception ex)
            {
                ex.Source = null;
            }

dentro de esto podría introducirse una acción como mostrar un mensaje de error por ejemplo. En este caso no haría nada.
Código:
 
 foreach (Element in Object)
{
}

Es un bucle que recorre todos los elementos de una lista, matriz o colección.

OpenFileDialog
Ahora voy con lo del cuadro de dialogo. Que en fin no es tan complicado, pero como dices que buscaste códigos que pudieras entender...

Por mi parte en el código que expuse anteriormente había un error técnico pues se me olvidó poner el código de compresión dentro de la condición if /then  ya que si se pulsa Cancelar se produce un error al no obtenerse ningún directorio de archivo. Como excusa hice un copia y pega del código de compresión y lo puse fuera de la condición olvidándome por completo del error que se produce al pulsar Cancelar.

Aquí lo vuelvo a poner corregido:
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Diagnostics;
  11. namespace WindowsFormsApplication1
  12. {
  13.    public partial class Form1 : Form
  14.    {
  15.        public Form1()
  16.        {
  17.            InitializeComponent();
  18.        }
  19.  
  20.        private void Form1_Load(object sender, EventArgs e)
  21.        {
  22.  
  23.        }
  24.  
  25.        private void button1_Click(object sender, EventArgs e)
  26.        {
  27.            using (OpenFileDialog ofd = new OpenFileDialog())
  28.            {
  29.                ofd.Title = "Archivos a comprimir";
  30.                ofd.Filter = "All files|*.*";
  31.                ofd.Multiselect = true;
  32.                if ((ofd.ShowDialog() == DialogResult.OK))
  33.                {
  34.                    System.IO.StreamWriter sw = new System.IO.StreamWriter("listfile.lst");
  35.                    //Crea una lista de archivos
  36.                    foreach (string n in ofd.FileNames)
  37.                    {
  38.                        sw.WriteLine(n);
  39.                    }//foreach
  40.                    sw.Close();
  41.  
  42.                    string targetName = "Example";
  43.                    //Carpeta de destino
  44.                    string pathDestination = "Prueba\\";
  45.                    ProcessStartInfo p = new ProcessStartInfo();
  46.                    p.FileName = "7za.exe";
  47.                    p.Arguments = "a " + pathDestination + targetName + " @listfile.lst" + " -t7z";
  48.                    p.WindowStyle = ProcessWindowStyle.Hidden;
  49.                    Process x = Process.Start(p);
  50.                    x.WaitForExit();
  51.                    System.IO.File.Delete("listfile.lst");
  52.                } //if
  53.            }//using
  54.  
  55.        }//button1
  56.  
  57.    }
  58. }
  59.  

EXPLICACIÓN
Lo primero es agregar la línea para usar la clase Process;
Código
  1. using System.Diagnostics;
  2.  

y

Código
  1. using System.Windows.Forms;


La clase OpenFileDialog abre un cuadro de diálogo "Abrir".
Ejemplo:

Código
  1. using System.Windows.Forms;
  2. ...
  3.  
  4.    using (OpenFileDialog ofd = new OpenFileDialog())
  5.            {
  6.                ofd.Title = "Archivos a comprimir";
  7.                ofd.Filter = "All files|*.*";
  8.                ofd.Multiselect = true;
  9.                ofd.ShowDialog();
  10.            }
  11.  

Pero ocurre que si no se selecciona nada el cuadro no devuelve ningún valor, o sea valor nulo. Por esta razón se usa la condición :
Código
  1. //Si se pulsa el botón OK...
  2.       if ((ofd.ShowDialog() == DialogResult.OK))
  3. {
  4. ...
  5. }
  6.  

Como el cuadro de diálogo que he creado tiene activa la opción MULTISELECT,
Código:
ofd.Multiselect = true;
es decir  que permite seleccionar múltiples archivos.

He hecho que guarde y cree un archivo con la lista de los directorios de los archivos seleccionados.  Para después ser comprimidos los archivos de la lista por 7za.exe.

Esta es la parte que crea el archivo
Código
  1.    System.IO.StreamWriter sw = new System.IO.StreamWriter("listfile.lst");
  2.                    //Crea una lista de archivos
  3.                    foreach (string n in ofd.FileNames)
  4.                    {
  5.                        sw.WriteLine(n);
  6.                    }//foreach
  7.                    sw.Close();
  8.  

donde ofd.FileNames es una colección o lista de elementos seleccionados en el cuadro OpenFileDialog

Cada elemento de la lista es ingresado en la variable string 'n' y luego escrito en el archivo por 'WriteLine'

Después de comprimir, la lista es eliminada con la línea:

Código
  1. System.IO.File.Delete("listfile.lst");

También puedes importar System.IO, al principio de código;
Código
  1. using System.Text;
  2. using System.Threading.Tasks;
  3. using System.Windows.Forms;
  4. using System.Diagnostics;
  5. using System.IO;
  6. namespace WindowsFormsApplication1
  7. {
  8.    public partial class Form1 : Form
  9.    {
  10.        public Form1()
  11. ...
  12.  

y luego poner solamente;

Código
  1. File.Delete("listfile.lst");


Para que 7za.exe comprima los archivos de la lista en un único archivo, se debe usar @ +  el nombre que contiene la lista de archivos, ej.: " @listfile.lst"
« Última modificación: 27 Noviembre 2017, 08:23 am por okik » En línea

rigorvzla

Desconectado Desconectado

Mensajes: 221


Ver Perfil
Re: 7-ZIp
« Respuesta #23 en: 27 Noviembre 2017, 16:59 pm »

gracias manos a la obra dare respuesta de que resulto feliz inicio de semana
En línea

rigorvzla

Desconectado Desconectado

Mensajes: 221


Ver Perfil
Re: 7-ZIp
« Respuesta #24 en: 28 Noviembre 2017, 02:32 am »

bueno copie el codigo y lo adapte a como lo quiero y lo muestro
Código:
 using (OpenFileDialog ofd = new OpenFileDialog())
                    {
                        ofd.Title = "Archivos a comprimir";
                        ofd.Filter = "All files|*.*";
                        ofd.Multiselect = true;
                        if ((ofd.ShowDialog() == DialogResult.OK)) <--- [b]LINEA ROJA EN OK. LA BORRE Y LO CORRI PERO HACE LO DE ABAJO [/b] (mayuscula por resaltar no gritar, aclaro)
                        {
                            System.IO.StreamWriter sw = new System.IO.StreamWriter("listfile.lst");
                            //Crea una lista de archivos
                            foreach (string n in ofd.FileNames)
                            {
                                sw.WriteLine(n);
                            }//foreach
                            sw.Close();

                            string targetName = "Example";
                            //Carpeta de destino
                            string pathDestination = "Prueba\\";
                            ProcessStartInfo p = new ProcessStartInfo();
                            p.FileName = "7za.exe";
                            p.Arguments = "a " + pathDestination + targetName + " @listfile.lst" + " -t7z";
                            p.WindowStyle = ProcessWindowStyle.Hidden;
                            Process x = Process.Start(p);
                            x.WaitForExit();
                            System.IO.File.Delete("listfile.lst");
                        } //if
                    }
                    break;
tengo fallas con esto primero soy yo, y es que no se como crear un objeto timer ... disculpen doy la orden y la ejecuta pero crea un 7z vacio en la carpeta prueba (aprendi q \\prueba implica la carpeta raiz y crea automaticamente) y lo otro es que se pone en rojo el OK no se si falta algo libreria referencia no se por qya todo esta cubierto segun.
y en contexto es ese el codigo completo tengo las dos librerias del 7z en la raiz del proyecto con el 7z.
En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: 7-ZIp
« Respuesta #25 en: 28 Noviembre 2017, 11:31 am »

Hola de nuevo  @rigorvzla

Imagino no estás programando una aplicación Windows Forms, es decir con formulario o ventana. Si no que estás programando en modo consola.

En modo consola aunque declares "using System.Windows.Forms;" te dará error en "Forms", porque no estás en modo 'formulario' si no en modo consola.

Aunque agreges referencia a System.Windows.Forms y lo declares te dará error en la línea que mencionas:

Código
  1. Dialog.Result.OK();

y el error será el siguiente:

Código:
El subproceso actual debe establecerse en el modo de subprocesamiento
 controlado simple (Single Thread Apartment, STA) para poder realizar llamadas OLE. Asegúrese de que la función Main
tiene marcado
STAThreadAttribute. Esta excepción sólo se desencadena si se adjunta un
depurador al proceso.


Los ejemplos que puse son para proyectos Windows Forms.

Los objetos como Button, Timer o TextBox son para formularios, y si creas un proyecto Windos Forms, tendrás disponible un cuadro de herramientas con dichos objetos que puedes incrustar en el formulario simplemente arrastrado o haciendo doble clic sobre ellos.



Crea  un nuevo proyecto de C# y selecciona "Aplicación de Windows Forms" entonces VS NET crea un proyecto con una ventana por defecto en la cual puedes meter objetos como un botón o un Timer. (el Timer aparecerá en la parte inferior fuera de la ventana)


Simplemente mete un botón y usa este código (acuérdate de colocar 7za.exe y 7za.dll en el directorio de la aplicación)


Código
  1. using System;
  2. using System.Windows.Forms;
  3. using System.Diagnostics;
  4. using System.IO;
  5. namespace WindowsFormsApplication1
  6. {
  7.    public partial class Form1 : Form
  8.    {
  9.        public Form1()
  10.        {
  11.            InitializeComponent();
  12.        }
  13.  
  14.        private void Form1_Load(object sender, EventArgs e)
  15.        {
  16.  
  17.        }
  18.  
  19.        private void button1_Click(object sender, EventArgs e)
  20.        {
  21.            using (OpenFileDialog ofd = new OpenFileDialog())
  22.                    {
  23.                        ofd.Title = "Archivos a comprimir";
  24.                        ofd.Filter = "All files|*.*";
  25.                        ofd.Multiselect = true;
  26.                        if ((ofd.ShowDialog() == DialogResult.OK))// <--- [b]LINEA ROJA EN OK. LA BORRE Y LO CORRI PERO HACE LO DE ABAJO [/b] (mayuscula por resaltar no gritar, aclaro)
  27.                        {
  28.                            System.IO.StreamWriter sw = new System.IO.StreamWriter("listfile.lst");
  29.                            //Crea una lista de archivos
  30.                            foreach (string n in ofd.FileNames)
  31.                            {
  32.                                sw.WriteLine(n);
  33.                            }//foreach
  34.                            sw.Close();
  35.  
  36.                            string targetName = "Example";
  37.                            //Carpeta de destino
  38.                            string pathDestination = "Prueba\\";
  39.                            ProcessStartInfo p = new ProcessStartInfo();
  40.                            p.FileName = "7za.exe";
  41.                            p.Arguments = "a " + pathDestination + targetName + " @listfile.lst" + " -t7z";
  42.                            p.WindowStyle = ProcessWindowStyle.Hidden;
  43.                            Process x = Process.Start(p);
  44.                            x.WaitForExit();
  45.                            File.Delete("listfile.lst");
  46.                        } //if
  47.                    }
  48.  
  49.        }
  50.    }
  51. }


Verás como te funciona a la perfección.


Ahora no tengo tiempo pero como veo que estás trabajando en modo consola veré como se puede aplicar todo esto en modo consola.




« Última modificación: 28 Noviembre 2017, 11:33 am por okik » En línea

rigorvzla

Desconectado Desconectado

Mensajes: 221


Ver Perfil
Re: 7-ZIp
« Respuesta #26 en: 28 Noviembre 2017, 16:16 pm »

en efecto estoy trabajando en modo WPF no el form ni el consola y supongo es el problema asi qlo probare de inmediato gracias por la paciencia  estare dandote datos de lo ocurrido



amigo resulto a la perfeccion como tu lo dijistes, lo que si me fije y trate de colocar y falle, fue el rate de compresion a 9
Código:
-mx=9
vere si puedo adaptar esto a un WPF ya que no se usar el form o el WPF tampoco pero se mas el otro es desconocido, gracias , aplicare lo mismo para el descomprimir, muchas gracias . solo queda asiganar el rate de compresion
Código:
-mx=9
y listo. Gracias!!



amigo resulto a la perfeccion como tu lo dijistes, lo que si me fije y trate de colocar y falle, fue el rate de compresion a 9
Código:
-mx=9
vere si puedo adaptar esto a un WPF ya que no se usar el form o el WPF tampoco pero se mas el otro es desconocido, gracias , aplicare lo mismo para el descomprimir, muchas gracias . solo queda asiganar el rate de compresion
Código:
-mx=9
y listo. Gracias!!

Decidi dejarlo en Form, cumple mi requerimiento solamente falta completar el
Código:
-mx=9
y listo ya queda esta parte.

si asi como esto puedo aplicar el de descomprimir entocnes ya publicare el codigo, y si no, volvere a pedir asistencia MUCHAS GRACIAS DE VERDAD!!!!



[MOD]: ESTÁ PROHIBIDO HACER DOBLE Y TRIPLE POST, POR FAVOR LEER LAS NORMAS DEL FORO Y DEL FORO DE PROGRAMACIÓN ANTES DE SEGUIR PUBLICANDO COMENTARIOS.
« Última modificación: 28 Noviembre 2017, 17:49 pm por Eleкtro » En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: 7-ZIp
« Respuesta #27 en: 28 Noviembre 2017, 22:11 pm »

Decidi dejarlo en Form, cumple mi requerimiento solamente falta completar el
Código:
-mx=9
y listo ya queda esta parte.

Pues  simplemente pones el comando de nivel de compresión al final de los comandos de 7za.exe:

Código
  1. p.Arguments = "a " + pathDestination + targetName + " @listfile.lst" + " -t7z -mx=9";

Lógico si quieres que el valor no sea fijo si no que se pueda modificar puedes sustituirlo por una variable

Código
  1.   int mx =1; //por defecto es uno
  2.   //...
  3. p.Arguments = "a " + pathDestination + targetName + " @listfile.lst" + " -t7z -mx=" + mx;
  4.  
  5.  

aunque realmente no es necesario usar el "=". Puedes ponerlo así -mx1, -mx2...
Código
  1. p.Arguments = "a " + pathDestination + targetName + " @listfile.lst" + " -t7z -mx" + mx;
  2.  


EN WPF
Para crear objetos como el Timer, el Button, TexBox, etc, el método a seguir es exactamente el mismo que en Windows Forms. Despliegas el cuadro de herramientas, arrastras el objeto o haces doble clic en él.

También puedes crearlos mediante código, de hecho OpenFileDialog también es un objeto o herramienta, pero no está disponible por defecto en proyectos WPF. Por esta razón es necesaria la declaración:
Código
  1. using Microsoft.Win32;

Tampoco tienes por defecto en proyectos WPF el objeto Timer.


Para corregir el error den DialogResult.OK, sustituyes por True:

Código
  1. ((ofd.ShowDialog() == true)))
  2.  

Ejemplo para WPF:
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Data;
  9. using System.Windows.Documents;
  10. using System.Windows.Input;
  11. using System.Windows.Media;
  12. using System.Windows.Media.Imaging;
  13. using System.Windows.Navigation;
  14. using System.Windows.Shapes;
  15.  
  16. using Microsoft.Win32; //Necesario para el uso de OpenFileDialog
  17. using System.Diagnostics; //Necesario para el uso de ProcessStartInfo y Precess
  18. using System.IO; //Necesario para el uso de File y StreamWriter
  19.  
  20. namespace WpfApplication1
  21. {
  22.    /// <summary>
  23.    /// Lógica de interacción para MainWindow.xaml
  24.    /// </summary>
  25.    public partial class MainWindow : Window
  26.    {
  27.        public MainWindow()
  28.        {
  29.            InitializeComponent();
  30.        }
  31.  
  32.        private void Button_Click_1(object sender, RoutedEventArgs e)
  33.        {
  34.  
  35.            OpenFileDialog ofd = new OpenFileDialog();
  36.  
  37.                ofd.Title = "Archivos a comprimir";
  38.                ofd.Filter = "All files|*.*";
  39.                ofd.Multiselect = true;
  40.                if ((ofd.ShowDialog() == true))
  41.                {
  42.                    StreamWriter sw = new StreamWriter("listfile.lst");
  43.                    //Crea una lista de archivos
  44.                    foreach (string n in ofd.FileNames)
  45.                    {
  46.                        sw.WriteLine(n);
  47.                    }//foreach
  48.                    sw.Close();
  49.                    int mx = 1;
  50.  
  51.                    string targetName = "Example";
  52.                    //Carpeta de destino
  53.                    string pathDestination = "Prueba\\";
  54.                    ProcessStartInfo p = new ProcessStartInfo();
  55.                    p.FileName = "7za.exe";
  56.  
  57.                    p.Arguments = "a " + pathDestination + targetName + " @listfile.lst" + " -t7z -mx" + mx;
  58.                    p.WindowStyle = ProcessWindowStyle.Hidden;
  59.                    Process x = Process.Start(p);
  60.                    x.WaitForExit();
  61.                    File.Delete("listfile.lst");
  62.                } //if
  63.  
  64.        }
  65.    }
  66. }
  67.  
  68.  



« Última modificación: 29 Noviembre 2017, 01:07 am por okik » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: 7-ZIp
« Respuesta #28 en: 28 Noviembre 2017, 23:56 pm »

Tampoco tienes por defecto en proyectos WPF el objeto Timer.

Pero puede usar un equivalente cercano y cuyo modo de empleo es practicamente idéntico:

...además también se puede usar la clase System.Threading.Timer, y la clase System.Windows.Forms.Timer en WPF... solo tiene que importar la librería ( System.Windows.Forms.dll ) al proyecto.

Saludos.
« Última modificación: 28 Noviembre 2017, 23:58 pm por Eleкtro » En línea



rigorvzla

Desconectado Desconectado

Mensajes: 221


Ver Perfil
Re: 7-ZIp
« Respuesta #29 en: 29 Noviembre 2017, 00:17 am »

muchas gracias @okik por un simple error de comillas no servia el argumento de compresion pero ya revisando el tuyo y corrigiendo el mio se resolvio, en efecto como dice @elektro habia leido sobre el DispatcherTimer Class | docs.microsoft.com, solo que no sabia como usarlo ni nada a pesar que habia encontrado informacion y el ingles no m e ayudo, (lo practicare mas si o si es necesario) . Dare este tema por terminado, causo bastante polemica y mas de mil vistas , espero que sea de ayuda para otros al igual que ami y doy muchas MUCHISIMAS!!!  gracias a los colaboradores que me asistieron , a pesar de no empezar con un buen pie espero no sea una piedra para nuestro camino, gracias y les traere nuevamente mas inquietudes al tenerlas.
Aplicare este mismo metodo al de descomprimir y publicare el codigo al estar listo, feliz noche y gracias nuevamente. gracias okik y elektro  :laugh: ;-)
(me disculpo por el doble o triple-post no sabia si era mejor editarlo y corregirlo asi q lo volvi a colocar pero se q no se debe hacer)

Código:
namespace Capture_Extractor
{
    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }


        private void button_Click(object sender, RoutedEventArgs e)
        {

            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Title = "Archivos a descomprimir";
            ofd.Filter = "All files|*.*";
            ofd.Multiselect = true;
            if ((ofd.ShowDialog() == true))
            {
                StreamWriter sw = new StreamWriter("listfile.lst");
                //Crea una lista de archivos
                foreach (string n in ofd.FileNames)
                {
                    sw.WriteLine(n);
                }//foreach
                sw.Close();
               

                string targetName = "Example";
                //Carpeta de destino
                string pathDestination = "Prueba\\";
                ProcessStartInfo p = new ProcessStartInfo();
                p.FileName = "7za.exe";

                p.Arguments = "7z x " + pathDestination + targetName + " @listfile.lst" ;
                p.WindowStyle = ProcessWindowStyle.Hidden;
                Process x = Process.Start(p);
                x.WaitForExit();
                File.Delete("listfile.lst");
            } //if
        }
    }
}

aqui esta el codigo del descomprimir y no hace nada , es posible en el argumento colocar de una vez los formatos (7z,zip,rar,iso, que son los mas comunes) en una sola linea? al yo colocar x es para que se extrajera en su propio directorio del nombre de archivo, creo q me falto la e , bueno probare y aqui les dejo el planteamiento de todos modos.
« Última modificación: 29 Noviembre 2017, 04:10 am por rigorvzla » En línea

Páginas: 1 2 [3] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines