Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: rigorvzla en 21 Noviembre 2017, 04:21 am



Título: 7-ZIp
Publicado por: rigorvzla en 21 Noviembre 2017, 04:21 am
Hola de nuevo amigos, despues de una batalla ganada en esta gran guerra jeje, me decido a usar (no se si llamarle api) de 7zip ya que quiero poder hacer click en un archivo cualquiera de mi pc y con una orden se comprima. alguien teine alguna idea? dejo un ejemplo que consegui pero no puedo llevar acabo ya que por mas click que hago enel archivo no me lo toma en cuenta al momento de ejecutar la orden.

Código:
string sourceName = "ExampleText.txt";
            string targetName = "Example.7z";

            // 1
            // Initialize process information.
            //
            ProcessStartInfo p = new ProcessStartInfo();
            p.FileName = "7za.exe";

            // 2
            // Use 7-zip
            // specify a=archive and -tgzip=gzip
            // and then target file in quotes followed by source file in quotes
            //
            p.Arguments = "a -t7z \"" + targetName + "\" \"" +
                sourceName + "\" -mx=9";
            p.WindowStyle = ProcessWindowStyle.Hidden;

            // 3.
            // Start process and wait for it to exit
            //
            Process x = Process.Start(p);
            x.WaitForExit();

SOlamente toma archivos en una ruta especifica y no una ruta cualquiera.
quice por iniciativa propia copiar en el portapapeles a ver si de ahi me lo tomaba y no. espero puedan ayudarme (aplicando la misma descripcion a descomprimir) y tomo este por que el winrar debe estar instalado en el huesped y el zip no tiene buena tasa de compresion.


Título: Re: 7-ZIp
Publicado por: Eleкtro en 21 Noviembre 2017, 13:56 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í:
  • https://sevenzipsharp.codeplex.com/SourceControl/latest (https://sevenzipsharp.codeplex.com/SourceControl/latest)

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


Título: Re: 7-ZIp
Publicado por: okik en 21 Noviembre 2017, 15:30 pm
Ya @Elektro te a respondido muy bien mientras yo intentaba ver cual era tu error.

Te doy esta respuesta más simplista ya que el código que expones está bien, solo hay varios errores en el argumento.


Código
  1. p.FileName = "7za.exe";
Solo necesitas la de consola 7za.exe y 7za.dll. Si lo tienes en otro directorio debes especificarlo ej.: p.Filename = "D:\\7za.exe"


Los argumentos están mal. Debe ser:

Código:
a destino " "  archivo/s  -t7z -mx=9

Nota: El destino debe contener también el nombre del archivo y no hace falta poner extensión pues ya especificas el tipo de archivo  con "-t7z".

Igualmente si pones como destino "D:\\Example.7z" no hace falta poner "-t7z" porque 7za.exe ya establecería el formato de archivo correspondiente.

 
Código
  1.          string sourceName = "ExampleText.txt";
  2.            string targetName = "Example";
  3.            ProcessStartInfo p = new ProcessStartInfo();
  4.            p.FileName = "7za.exe";
  5.  
  6.            p.Arguments = "a " +  targetName + " " + sourceName + " -t7z -mx=9";
  7.            p.WindowStyle = ProcessWindowStyle.Hidden;
  8.  
  9.            Process x = Process.Start(p);
  10.            x.WaitForExit();
  11.  

Si lo hicieras así crearía una carpeta llamada prueba en el mismo directorio del programa:

          
Código
  1. string sourceName = "ExampleText.txt";
  2.            string targetName = "Example";
  3.            string pathDestination = "Prueba\\";
  4.            ProcessStartInfo p = new ProcessStartInfo();
  5.            p.FileName = "7za.exe";
  6.  
  7.            p.Arguments = "a " + pathDestination + targetName + " " + sourceName + " -t7z -mx=9";
  8.            p.WindowStyle = ProcessWindowStyle.Hidden;
  9.  
  10.            Process x = Process.Start(p);
  11.            x.WaitForExit();
  12.  


Comandos 7za.exe v.17.1.0.0
Código:
Usage: 7za <command> [<switches>...] <archive_name> [<file_names>...]

<Commands>
  a : Add files to archive
  b : Benchmark
  d : Delete files from archive
  e : Extract files from archive (without using directory names)
  h : Calculate hash values for files
  i : Show information about supported formats
  l : List contents of archive
  rn : Rename files in archive
  t : Test integrity of archive
  u : Update files to archive
  x : eXtract files with full paths

<Switches>
  -- : Stop switches parsing
  @listfile : set path to listfile that contains file names
  -ai[r[-|0]]{@listfile|!wildcard} : Include archives
  -ax[r[-|0]]{@listfile|!wildcard} : eXclude archives
  -ao{a|s|t|u} : set Overwrite mode
  -an : disable archive_name field
  -bb[0-3] : set output log level
  -bd : disable progress indicator
  -bs{o|e|p}{0|1|2} : set output stream for output/error/progress line
  -bt : show execution time statistics
  -i[r[-|0]]{@listfile|!wildcard} : Include filenames
  -m{Parameters} : set compression Method
    -mmt[N] : set number of CPU threads
    -mx[N] : set compression level: -mx1 (fastest) ... -mx9 (ultra)
  -o{Directory} : set Output directory
  -p{Password} : set Password
  -r[-|0] : Recurse subdirectories
  -sa{a|e|s} : set Archive name mode
  -scc{UTF-8|WIN|DOS} : set charset for for console input/output
  -scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}} : set charset for list files
  -scrc[CRC32|CRC64|SHA1|SHA256|*] : set hash function for x, e, h commands
  -sdel : delete files after compression
  -seml[.] : send archive by email
  -sfx[{name}] : Create SFX archive
  -si[{name}] : read data from stdin
  -slp : set Large Pages mode
  -slt : show technical information for l (List) command
  -snh : store hard links as links
  -snl : store symbolic links as links
  -sni : store NT security information
  -sns[-] : store NTFS alternate streams
  -so : write data to stdout
  -spd : disable wildcard matching for file names
  -spe : eliminate duplication of root folder for extract command
  -spf : use fully qualified file paths
  -ssc[-] : set sensitive case mode
  -ssw : compress shared files
  -stl : set archive timestamp from the most recently modified file
  -stm{HexMask} : set CPU thread affinity mask (hexadecimal number)
  -stx{Type} : exclude archive type
  -t{Type} : Set type of archive
  -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName] : Update options
  -v{Size}[b|k|m|g] : Create volumes
  -w[{path}] : assign Work directory. Empty path means a temporary directory
  -x[r[-|0]]{@listfile|!wildcard} : eXclude filenames
  -y : assume Yes on all queries





Título: Re: 7-ZIp
Publicado por: rigorvzla en 21 Noviembre 2017, 17:34 pm
Código:
          [code=csharp] string sourceName = "ExampleText.txt";
            string targetName = "Example";
            string pathDestination = "Prueba\\";
            ProcessStartInfo p = new ProcessStartInfo();
            p.FileName = "7za.exe";

            p.Arguments = "a " + pathDestination + targetName + " " + sourceName + " -t7z -mx=9";
            p.WindowStyle = ProcessWindowStyle.Hidden;

            Process x = Process.Start(p);
            x.WaitForExit();

muchas gracias, buscaba la forma de que creara una carpeta y ahi almacenara el archivo comprimido ese punto estubo bueno @elektro muchas gracias por esa gran explicacion, @okika , este planteamiento esta excelente, ahora falta un detalle que es con lo que no doy, yo necesito hacer click en un archivo y sobrearlo, en ese punto cuando corra esos parametros , me tome el click y haga lo q debe hacer
Código:
string sourceName = "ExampleText.txt";
este parametro no me capta lo que yo tenga el objeto seleccionado en ese momento ya que requiere una direccion predestianda . mi pregunta es como puedo dejar ese valor en blanco y que me tome el objeto que  tenga seleccionado con el click del raton, o que se cree un objeto con el clikck del raton para yo al tener ese valor capturado referenciarlo como archivo a comprimir.[/code]


Título: Re: 7-ZIp
Publicado por: okik en 21 Noviembre 2017, 19:45 pm
mi pregunta es como puedo dejar ese valor en blanco y que me tome el objeto que  tenga seleccionado con el click del raton, o que se cree un objeto con el clikck del raton para yo al tener ese valor capturado referenciarlo como archivo a comprimir.

Es posible añadir tu programa al menú emegergente de propiedades de archivos de Windows. Que aparezca tu programa y crear compresión del archivo o archivos seleccionados pero se vuelve un tema más complejo.


Sin embargo puedes implementar tu propio explorador o más fácil aún utilizar un cuadro de diálogo.

Puedes usar el cuadro OpenFileDialog (https://msdn.microsoft.com/es-es/library/system.windows.forms.openfiledialog(v=vs.110).aspx).

Luego aplicar el modo "multiselect (https://msdn.microsoft.com/es-es/library/system.windows.forms.openfiledialog.multiselect(v=vs.110).aspx)" para comprimir multiples archivos

Introducelos en una lista, por ejemplo un archivo temporal listfile.lst, lst.tmp, listfile.txt, lo que prefieras.

Finalmente aplicas el comando:

Código:
a NameFileZip @listfile.lst -t7z



También puedes crear otro cuadro de diálogo para elegir el destino y nombre del archivo y tipo.

Ejemplo:

    
Código
  1.     using (OpenFileDialog ofd = new OpenFileDialog())
  2.                {
  3.                    ofd.Title = "Archivos a comprimir";
  4.                    ofd.Filter = "All files|*.*";
  5.                    ofd.Multiselect = true;
  6.                    if ((ofd.ShowDialog() == DialogResult.OK))
  7.                    {
  8.                        System.IO.StreamWriter sw = new System.IO.StreamWriter("listfile.lst");
  9.                        //Crea una lista de archivos
  10.                        foreach (string n in ofd.FileNames)
  11.                        {
  12.                            sw.WriteLine(n);
  13.                        }
  14.                        sw.Close();
  15.                    }
  16.                }
  17.  
  18.  
  19.  
  20.                string targetName = "Example";
  21.                //Carpeta de destino
  22.                string pathDestination = "Prueba\\";
  23.                ProcessStartInfo p = new ProcessStartInfo();
  24.                p.FileName = "7za.exe";
  25.                p.Arguments = "a " + pathDestination + targetName + " @listfile.lst" + " -t7z";
  26.                p.WindowStyle = ProcessWindowStyle.Hidden;
  27.                Process x = Process.Start(p);
  28.                x.WaitForExit();
  29.                System.IO.File.Delete("listfile.lst");
  30.  


he añadido  al código para borrar la lista una vez usada por 7za.exe
Código
  1. System.IO.File.Delete("listfile.lst");

También he cambiado el título al cuadro de diálogo porque le puse "Abrir imagen" que no es el caso   :P

También había una errata entre comillas porque puse
Código
  1.   p.FileName = "7z.exe";
y no
Código
  1.   p.FileName = "7za.exe";

He usado una versión más vieja la 16, por eso puse 7z.exe y no 7za.exe


Título: Re: 7-ZIp
Publicado por: Eleкtro en 21 Noviembre 2017, 20:33 pm
yo necesito hacer click en un archivo y sobrearlo, en ese punto cuando corra esos parametros , me tome el click y haga lo q debe hacer
Código:
string sourceName = "ExampleText.txt";
este parametro no me capta lo que yo tenga el objeto seleccionado en ese momento ya que requiere una direccion predestianda . mi pregunta es como puedo dejar ese valor en blanco y que me tome el objeto que  tenga seleccionado con el click del raton, o que se cree un objeto con el clikck del raton para yo al tener ese valor capturado referenciarlo como archivo a comprimir.

Disculpa pero no se te entiende nada, no se que es "sobrear" un archivo, ni tampoco "que me tome el click y haga lo que debe hacer", ¿que es lo que debe hacer?. Intenta explicar todo con mejor detalle, sin prisa pero sin pausa lo que quieres hacer, por que así no vamos a ninguna parte...

Lo que has dicho se puede interpretar de mil formas, como por ejemplo no sé si te puedes estar refiriendo a crear una shell-extensión y registrarla en el S.O. para añadir una nueva opción/comando al menú contextual de archivos, para que aparezca un comando personalizado cuando haces click derecho sobre un archivo, y ahí ya estariamos hablando de programación avanzada (que además requiere conocimiento de C/C++) que no sería una tarea apta para alguien que acaba de empezar en C# / .NET, pero bueno, no voy a suponer nada ni a explicar más de la cuenta por que no se entiende lo que quieres hacer y a lo mejor no es eso.

De todas formas es que estás formulando preguntas de programación avanzada que no van acorde al nivel actual de aprendizaje que llevas, son cosas que en mi humilde opinión no creo que las vayas a poder entender ni llevar a cabo sin la suficiente experiencia y la práctica, pides que te digan como hacer las cosas como panes, pero no muestras nada acerca de tu supuesta investigación, ¿donde has buscado?, ¿qué has intentado hacer por ti mismo?, ¿donde está el código que demuestra lo que te has esforzado en intentar?. Recuerda que aquí no le hacemos el trabajo a nadie.

...Aun así, voy a ser bueno, y te ofreceré soluciones:

· 1-A
Si te estás refiriendo a lo de añadir una opción al menú contextual de archivos, una forma más o menos sencilla de hacerlo sería a través de la librería de terceros SharpShell:
  • https://www.codeproject.com/Articles/512956/NET-Shell-Extensions-Shell-Context-Menus
...la librería basicamente contiene un montón de wrappers de varios miembros de C++, es una librería con ciertas limitaciones por eso, pero es una manera cómoda y viable para desarrollar una shell-extension con código administrado y así evitar todo el embrollo que tendriams que implementar con código nativo....

· 1-B
Una forma cutre pero todavía más sencilla (mucho, mucho más sencilla) de hacerlo sería mediante el registro de Windows, simplemente agregando un par de claves. Es una forma muy sencilla como digo, y estoy seguro que puedes encontrar miles de ejemplos en Google si buscas por "cómo agregar programa al menú contextual de archivos". Evidentemente esto ya no sería una extensión de la shell, es una opción muy limitada en comparación, pero igual te podría servir para cumplir el objetivo que tengas... dependiendo de cual sea este (si es algo básico como hacer click derecho sobre un archivo para "cargar" ese archivo en tu programa, entonces esta metodología te sirve de sobra sin necesidad de crear una shell-extension).

· 2-A
Si por lo contrario te estás refiriendo a detectar cuando un elemento (archivo o directorio) es seleccionado en la instancia/ventana activa del explorador de Windows, la manera correcta de llevar a cabo esta tarea sería aplicando un hook al Explorer (al objeto ExplorerWindow), para escuchar los eventos de selección de elementos. Esto es algo que requeriría mucha investigación, análisis en profundidad del proceso Explorer.exe, es decir, de las llamadas internas a APIs y los parámetros que se utilicen, y bastante ensayo y error. Pides cosas muy avanzadas (también son avanzadas para mi, no soy un experto en hooks ni API hooks), evidentemente no tengo un ejemplo que mostrar, y dudo que haya alguno por Internet... basicamente por que es un tema complicado donde cualquier trabajo suele hacerse para uno mismo, y también es una necesidad o duda muy específica. De todas formas puedo recomendarte una librería comercial para .NET muy util con la que he trabajado en el pasado para este tipo de inyecciones: Deviare API Hook

· 2-B
Una forma cutre (no tan eficiente) de hacerlo sería mediante un objeto Timer para determinar cada poco intervalo de tiempo (100 ms por ejemplo) si existe algún archivo/carpeta seleccionado en la ventana que esté activa. Sería una solución basada en el uso de los wrappers de interfaces nativas que expone el objeto Shell.

Esta metodología tendría un gran inconveniente y es que realmente no estariamos detectando o suscritos a ningún "evento de selección de archivos" en el Explorer, sino que estariamos asumiendo ciertas cosas con un margen de error aceptable.

He escrito el siguiente ejemplo para aplicar esta metodología. Aquí lo tienes:

Código
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Security;
  4.  
  5. [SuppressUnmanagedCodeSecurity]
  6. public sealed class SafeNativeMethods {
  7.  
  8.    // http://msdn.microsoft.com/en-us/library/windows/desktop/ms633505%28v=vs.85%29.aspx
  9.    [DllImport("User32.dll", SetLastError = false)]
  10.    public static extern IntPtr GetForegroundWindow();
  11.  
  12. }

+

Código
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. using Shell32;
  5. using SHDocVw;

Código
  1. public static IEnumerable<FolderItem> GetSelectedItems() {
  2.  
  3.    IntPtr hwnd = SafeNativeMethods.GetForegroundWindow();
  4.  
  5.    // http://msdn.microsoft.com/en-us/library/windows/desktop/ff521731%28v=vs.85%29.aspx
  6.    Shell shell = new Shell();
  7.    ShellWindows windows = (ShellWindows)((IShellDispatch6)shell).Windows();
  8.  
  9.    foreach (InternetExplorer window in windows) {
  10.        if (window.HWND == Convert.ToInt32(hwnd)) {
  11.            foreach (FolderItem item in ((IShellFolderViewDual3)window.Document).SelectedItems()) {
  12.                yield return item;
  13.            }
  14.            break;
  15.        }
  16.    }
  17.  
  18. }

+

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. using Shell32;

Código
  1. private void Timer1_Tick(object sender, EventArgs e) {
  2.  
  3. IEnumerable<FolderItem> items = GetSelectedItems();
  4.  
  5. if ( items.Any() ) {
  6. IEnumerable<string> filepath = (from item in itemsitem.Path);
  7.  
  8. } else {
  9. // No items selected, or none Explorer window has focus. (hard to debug)
  10.  
  11. }
  12.  
  13. }

El código de arriba requiere una referencia a las sigueintes librerías COM:
  • Microsoft Internet Controls
  • Microsoft shell Controls And Automation

Saludos!


Título: Re: 7-ZIp
Publicado por: okik en 21 Noviembre 2017, 20:39 pm
Disculpa pero no se te entiende nada, no se que es "sobrear" un archivo, ni tampoco "que me tome el click y haga lo que debe hacer", ¿que es lo que debe hacer?. Intenta explicar todo con mejor detalle, sin prisa pero sin pausa lo que quieres hacer, por que así no vamos a ninguna parte...
:xD
Hombre, yo creo con "sobrear" supongo que quiso escribir "sombrear" o sea seleccionar un archivo y con que me tome el click y haga lo que debe hacer" es que lo comprima.

Por eso yo le he puesto lo del cuadro de diálogo, porque puedes seleccionar (sobrear), hacer clic y que comprima los archivos.



Título: Re: 7-ZIp
Publicado por: Eleкtro en 21 Noviembre 2017, 21:06 pm
Hombre, yo creo con "sobrear" supongo que quiso escribir "sombrear"

Lo se, pero el término "sombrear" sigue siendo muy poco acertado para intentar describir algo en el área de la informática / programación. Yo no tengo tan claro que se refiera a "seleccionar", basicamente por que ha dicho somrbear... no ha dicho seleccionar, clickar, pinchar, o pulsar. Creo que se me entiende xD. No se si parezco alguien muy exigente al decir esto, pero creo que es un requisito esencial tratar de utilizar las palabras adecuadas al formular una duda sobre programación... más que nada para evitar que se pueda mal interpretar, por que si se mal interpreta acabamos aquí dando mil soluciones distintas que nada tienen que ver con la duda real... y gastando "saliba" para nada, en vano.

Por eso yo le he puesto lo del cuadro de diálogo, porque puedes seleccionar (sobrear), hacer clic y que comprima los archivos.

Se que no viene al caso lo que voy a decir, pero me apetece decirlo para rellenar un poco más este comentario xD... :

En cierto modo me ha gustado ver esta "compenetración", me refiero, cada uno le hemos explicado sobre diferentes cosas, jeje. Con el compañero NEBIRE me pasa igual. Bueno, es obvio que si ves que alguien ya ha explicado algo, pues el otro va a intentar aportar algo diferente, o algo adicional a la solución que ya se ha dado, o incluso alguna rectificación necesaria al código del otro. Está bien eso, por que cada uno aporta diferentes puntos de vista con sus respectivas soluciones, recomendaciones, pseudo-código, etc.

Bueno, creo que estoy haciendo demasiado offtopic desviandome del tema...

Un saludo.


Título: Re: 7-ZIp
Publicado por: rigorvzla en 21 Noviembre 2017, 23:58 pm
sin animos de ofender @elektro , me parecio tedioso leer tooodo ese poco texto que escribiste , pero las primeras lineas me dijeron de ti aspectos que no vienen al caso, te doy gracias por las respuestas y si, al parecer hago un programa de  programacion "avanzada", (cosa que no me va mal hasta el momento). encontre lo que queria  por mis medios  y obvio preguntando a personas que me dan respuestas claras , simples concisas y entendibles para cualquier nivel.

gracias a los que entendieron mi vocablo poco especifico etico profesional y burdo,  lastima no puderon saber responder se agradece tambien.

seguire preguntando si tengo dudas y agradecere de antemano a los que respondan mis inquietudes, supongo que es algo donde todos aprendemos creo que le llaman  "feedback" o " dialogo de ideas". gracias nuevamente su colaboracion para mis inquietudes.


Título: Re: 7-ZIp
Publicado por: Eleкtro en 22 Noviembre 2017, 00:54 am
Pues si que me ofende, me ofende que una persona formule una pregunta de programación, pero esa misma persona no esté dispuesta a leer una respuesta extensa y detallada para aprender o al menos para hacerse una idea de como hacer "X" cosa, y para colmo despreciar o infravalorar las expliacciones que te di, las cuales, como ya has dicho, no has leido.

Lo peor de todo es que respondiste para decir eso pero sigues sin aclararnos lo que querías decir con "sombrear", ni tampoco aclaraste cual era el problema, ni compartiste tu solución para los demás usuarios que anden en una situación parecida a la tuya. Eso también es casi ofensivo. Bueno, despues de leer todo lo que has dicho, inentaré tomármelo lo mejor que pueda, eso sí, mi "feedback" ya no lo tendrás a partir de este momento, aunque eso no te importe mucho, por que el que ha acabado perdiendo el tiempo escribiendo y compartiendo soluciones que no vas a leer, he sido yo.

La culpa es mia por hacerme expectativas con personas que no están dispuestas a leer, sino que más bien solo buscan "que le den códigos". Al menos tuviste el detalle de agradecer, lo tendré en cuenta, gracias a ti también... en ese aspecto.

EDITO: de todas formas me gustaría intentar que comprendas (suponiendo que este comentario no te parezca demasiado tedioso y lo leas) que siempre intento compactar la información lo mejor que puedo, pero hay un problema: es demasiada información, y al final se requiere de varias lineas para simplificar una explicación con tanta información que ofrecer, y creeme si te digo que lo hago (o al menos lo intento) y me salto intencionadamente muchos detalles importantes por el camino para no extenderlo mucho más.

Un saludo y suerte con tus cosas.


Título: Re: 7-ZIp
Publicado por: rigorvzla en 22 Noviembre 2017, 02:01 am
si lei todo con detalle, pero no aplica al planteamiento q hice, ocurre que no encuentro la forma de explicarme, no es simple para mi a (sombrear) ,me refiero a seleccionar, clikar , ... no tengo mas sinonimos , siempre agradeci tu ayuda y la de los demas, no entiendo como no entiendes mi terminologia cutre, simple y sencilla, aun no eh encontrado la solucion en este tema, supongo que lo diras por el tema anterior y si lo deje de lado cosa que hare de inmediato, formule un tema que se le encontro respuesta y no la di , ahi te acepto eso.

procuro dar planteamientos simples pero entendibles para cualquier ususario por  q asi yo tenga un gran conocimiento de equis tema, lo mejor es que todos me entiendan asi sea explicandolo con , peras y manzanas, osea de manerasimple , o usando terminos sencillos sin importar que me deba extender, te agradezco nuevamente por la ayuda que me has brindado.  pero mi poca terminologia o falta de argumentacion de problema ha hecho q no, nos entendamos.

eh optado por usar el comando Mouse.Capture(); (y aclaro no se como usarlo) asumiendo que con el yo pueda capturar la direccion del objeto seleccionado, entiendase por objeto, algun icono como carpetas o archivos cualquiera, una vez esto , ya en el codigo tener una referencia de ese valor, dato  objeto, variante, string, no se como decirlo de manera entendible o no se cual seria la definicion, ok  al tener esto, se llene el espacio en mi codigo y ejecute la accion que debe, cosa que si hace ya. mas no con el archivo que quiero por que aun no captura su direccion, patch, ruta.
un ejemplo visual seria este
Código:
case "comprimir eso":
                    string sourceName = "c:\\ARCHIVO A CAPTURAR";(OBTENIDO POR EL CLICK)
                    string targetName = @"\Temp\Example.7z";
                    ProcessStartInfo p = new ProcessStartInfo();
                    p.FileName = "7za.exe";
                    p.Arguments = "a -t7z \"" + targetName + "\" \"" +
                        sourceName + "\" -mx=9";
                    p.WindowStyle = ProcessWindowStyle.Hidden; Process x = Process.Start(p);
                    x.WaitForExit();
                    break;
si aun tienes la curiosidad de saber como resolverlo y decirme que planteamiento crees correcto perfecto, y si no, bueno eres libre de hacer lo que crees correcto. dejo ahi eso para cualquier otra persona que desee ayudar.


Título: Re: 7-ZIp
Publicado por: okik en 23 Noviembre 2017, 01:45 am
@rigorvzla para empezar creo que valoras poco o nada los aportes y la ayuda que ofrece @Elektro. En ningún sitio, y repito de nuevo EN NINGÚN SITIO encontrarás la ayuda y la información gratuita y podría decirse, altruista sobre NET que te ofrece @Elektro. Yo personalmente he aprendido mucho de @Elektro y sus explicaciones así como de sus códigos. Que aunque a veces no resuelvan tu duda si que da pistas o indican el camino para llegar al objetivo que planteamos.

En cuanto a tu dudas sobre el código. No entiendo porqué quieres hacer lo de "sombrear" y "click" y que haga lo que debe hacer. Ya te he puesto un código que te abre un cuadro de diálogo en el que puedes seleccionar (sombrear) y clicar el archivo que quieras y además seleccionar múltiples archivos. ¿Has probado el código? ¿No te funciona?

Además, no explicas el modo que quieres que lo haga ¿Tal cual como WinZip o WinRar?  Digo yo que desde el menú de explorer . ¿no?
(http://www.troubleshootyourself.com/wp-content/uploads/2015/10/Post07102015_01_c.jpg)

Si no es eso lo que pides ya es muy de hack. es trabajar desde Explorer.exe, hacer un hook (gancho, enlace) desde Explorer.exe a nuestro programa y capturar los archivos que haya seleccionados con el ratón.

Para qué complicarte tanto la vida.

Otra opción sería añadir unas claves al registro para mostrar la opción de comprimir con nuestro programa desde explorer, al seleccionarla nuestro programa (el tuyo) se abre, recibe el directorio del archivo a comprimir y éste se comprime. Pero incluso WinZip y WinRar te abre un cuadro de diálogo para elegir opciones así como la ruta donde guardar el archivo comprimido.

7z también tiene un modo 'ventana' con su propio explorador (como ya te propuse en otra respuesta).


Título: Re: 7-ZIp
Publicado por: Serapis en 23 Noviembre 2017, 04:28 am
Para lo que quieres hay varias formas de hacerlo. 2 relativamente sencillas (siempre que se sepa un mñínimo de programación)...

1 - Añade una interfaz gráfica a tu programa. en el como te dice Okik, usa un control OpenFileDialog, para guiar al usuario a la carpeta deseada y que elija uno o varios ficheros. A la devolución del openfiledialog.show, si hay al menos un fichero (si no se canceló), usas la ruta openfiledialog.filename como ruta para comprimir.
(mira bien los métodos que ofrece (.initdir , .path, .extension, .filter, etc...)

2 - Como te señaló Elektro, añadiendo una shellextensión. A tu nivel, mejor el 'modo cutre' añadiendo alguna clave al registro en las clases "*" (cualquier fichero) incluso en "folder", para comprimir el contenido de toda una carpeta.
en este caso tu programa no precisa una interfaz de usuario, el usuario usa el 'explorador de ficheros' del propio windows, cuando el usuario pincha en un fichero, se muestra el menú contextual (el menú emergente del explorador de ficheros de windows) y si el usuario elige del menú la opción (de ejemplo): "Comprimir con rigorvzla.exe", la shell de windows, enviará un comando a tu programa (el formato del mismo es el que tú le dejes al editar la clave en el registro), es decir tu programa se arrancará y recibirá un comando 8una orden), con al menos 1 parámetro (las ruta del fichero)... ahí tu ya examinas la orden recibida (que tú elegiste poner en las claves del registro) para saber que orden es, qué se debe hacer con ese fichero... y si es comprimir, lo comprimes.

3 - Similar al openFioleDialog, solo que en vez de usar un control para el caso, lo creas tú a tu antojo (no es preciso que sea un control de usuario, puede ser una ventana con toda la funcionalidad exprofeso). al final tendrás un control de tipo lista, donde se ha rellenado con los nombres de los ficheros qwue contenga la carpeta seleccionada, al caso ahí sería acertado seleccionar el/los ficheros deseados yluego pulsar un botón "&Comprimir", que es donde se le dará la orden. el botón solo se activaría cuando la lista tenga ítems seleccionados... etc, etc... (si me enrrollo, corro el riesgo de que tampoco lo leas).

Y sin ánimo de crear polémica, yo también desconozco eso de sombrar o sombrear... técnicamente seleccionar un ítem de una colección, puede o no tener sombra, pués es una cuestión meramente gráfica y a gusto del que lo programe, típicamente se cambia de color el ítem, o se pone en negrita, incluso hay quien lo refleja cambiando el tamaño y/o el tipo de fuente. Si además de seleccionado es el ítem que tiene el foco, lo típico es dibujar una retícula de puntos sobre el ítem. Mi consejo es que si quieres programar-ser programador, uses la jerga de los programadores, para hacerte entender. No puede haber un lenguaje por cada programador, sería como la torre de Babel, ininteligible, jamás nos entenderíamos y se pierde muchísimo tiempo con ello... Si leyeras todo eso que no quieres leer, sin darte cuenta se te 'pegaría' la jerga adecuada...

p.d.: en realidad en la red, hay muchos ejemplos con código para cada caso... pero para encontrarlos, efectivamente hace falta usar las palabras correctas en el buscador.




Título: Re: 7-ZIp
Publicado por: rigorvzla en 23 Noviembre 2017, 17:35 pm
@NEBIRE @OKIK muchas gracias por estas respuesta en efecto @elektro si me ha ayudado y nunca lo eh negado al igual que uds cosa q vuelvo agradecer, no coloque sombrear en el buscado coloque "capturar, ruta de click , o raton" asi no en ese orden solo supuse con con uds el sombrear se sobreentenderia que era seleccionar, pero es de aprender a usar mejor la argumentacion de palabras .

volviendo al tema encontre un ejemplo en internet muy bueno mas no se ahora como adaptarlo a mi codigo y se los dejare a ver quien puede adaptarlo, la explicacion estaria bien pero siempre aprendo al observar ya que desconozco el lenguaje profesional .

Código:
 //case "comprimir eso":
                //    //    string filename;

                //    //    ArrayList selected = new ArrayList();

                //    //    foreach (SHDocVw.InternetExplorer window in new SHDocVw.ShellWindows())
                //    //    {
                //    //        filename = System.IO.Path.GetFileNameWithoutExtension(window.FullName).ToLower();
                //    //        if (filename.ToLowerInvariant() == "explorer")
                //    //        {
                //    //            Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems();
                //    //            foreach (Shell32.FolderItem item in items)
                //    //            {
                //    //                Process.Start(item.Path);
                    
                //    string sourceName = " ";
                //    string targetName = @"\Temp\Example.7z";
                //    ProcessStartInfo p = new ProcessStartInfo();
                //    p.FileName = "7za.exe";
                //    p.Arguments = "a -t7z \"" + targetName + "\" \"" +
                //        sourceName + "\" -mx=9";
                //    p.WindowStyle = ProcessWindowStyle.Hidden; Process x = Process.Start(p);
                //    x.WaitForExit();

                //    //            }

                //    //        }

                //    //    }
                //    break;

asi lo coloque en mi proyecto OJO sin mencionar pero no seee como ahora hacer o que poner  o donde colocar , mi accion
Código:
   //    string sourceName = " ";
                //    string targetName = @"\Temp\Example.7z";
                //    ProcessStartInfo p = new ProcessStartInfo();
                //    p.FileName = "7za.exe";
                //    p.Arguments = "a -t7z \"" + targetName + "\" \"" +
                //        sourceName + "\" -mx=9";
en ese codigo , un amigo me explico su funcion , utilidad de ese codigo mas no como o donde adaptar a mi codigo.

entonces tengo la herramienta mas no se como usarla jaja

basicamente ese codigo captura la ruta completa del archivo sin extension osea (directorio) luego al yo dar la orden ejecuta la linea de comandos y comprime el directorio.

tengo la misma accion para descomprimir

y aparte mi amigo me dio tambien otro  codigo donde se basa en lo mismo para capturar rutas con extensión

aqui lo ven

Código:
       [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();
        private void VerificarSeleccion()
        {
            string filename;
            string sourceName = ""; //declarar source arriba del foreach
            ArrayList selected = new ArrayList();
            IntPtr handle = GetForegroundWindow();
            foreach (SHDocVw.InternetExplorer window in new SHDocVw.ShellWindows())
            {

                if (window.HWND == (int)handle)
                {

                    filename = System.IO.Path.GetFileNameWithoutExtension(window.FullName).ToLower();
                    if (filename.ToLowerInvariant() == "explorer")
                    {
                        FolderItems items = ((IShellFolderViewDual2)window.Document).SelectedItems();
                        foreach (FolderItem item in items)
                        {
                            //selected.Add(item.Path);
                            sourceName = item.Path; //asigna valor al source

                        }
                    }
                }
                
            }


            //y aqui llamar al source
            Process.Start(new ProcessStartInfo(sourceName));
        }
    }
}

este si no se como usarlo ni adaptarlo

este otro es el de directorio solo

Código:
private void VerificarSeleccion()
        {
            string filename;
            string sourceName = ""; //declarar source arriba del foreach
            ArrayList selected = new ArrayList();
            IntPtr handle = GetForegroundWindow();
            foreach (SHDocVw.InternetExplorer window in new SHDocVw.ShellWindows())
            {

                if (window.HWND == (int)handle)
                {

                    filename = System.IO.Path.GetFileNameWithoutExtension(window.FullName).ToLower();
                    if (filename.ToLowerInvariant() == "explorer")
                    {
                        sourceName = ((IShellFolderViewDual2)window.Document).FocusedItem.Path; // para directorios

                        //FolderItems items = ((IShellFolderViewDual2)window.Document).SelectedItems(); // para archivos
                        //foreach (FolderItem item in items)
                        //{
                        //    //selected.Add(item.Path);
                        //    sourceName = item.Path; //asigna valor al source

                        //}
                    }
                }
                
            }


            //y aqui llamar al source
            Process.Start(new ProcessStartInfo(sourceName));
        }
    }
}

se que ahi esta la respuesta a mi requerimiento pero no se como aplicarlo usarlo , no se q es eso de declarar y se lo eh hecho mas no se en que momento ya que no entiendo, disculpen mi brutalidad de verdad...

y aqui otro codigo que encontre mas simple y a simple vista mia resulta de la misma manera

Código:
//case "comprimir":

                //    string file_name = string.Empty;

                //    OpenFileDialog openFileDialog1 = new OpenFileDialog();

                //    if (openFileDialog1.ShowDialog() == DialogResult.OK)
                //    {
                //        string dir = @openFileDialog1.FileName();
                //      string destino = Path.GetFileName(dir);


                //    }
                //    string sourceName = " ";
                //    string targetName = @"\Temp\Example.7z";
                //    ProcessStartInfo p = new ProcessStartInfo();
                //    p.FileName = "7za.exe";
                //    p.Arguments = "a -t7z \"" + targetName + "\" \"" +
                //        sourceName + "\" -mx=9";
                //    p.WindowStyle = ProcessWindowStyle.Hidden; Process x = Process.Start(p);
                //    x.WaitForExit();


Título: Re: 7-ZIp
Publicado por: Serapis en 23 Noviembre 2017, 17:48 pm
Ya pero aquí entonces se suma una falta de conocimientos mínimos del lenguaje.

Es absurdo pretender crear un avión desde cero, si no se sabe ni lo que es un tornillo, una rueda, un ala... primero necesitas aprender física elemental, luego mecánica,  termodinámica, y más cosas cada vez más específicas. Pero si uno ni llega a saber el nombre de las cosas, lo único que se le puede aconsejar es que aprenda a gatear, luego a andar... querer correr sin mantenerse de pie, lleva a muchas caídas y que los dmeás te 'empalillen' las piernas para que tu creas que 'corres' no es la solución.

Mi consejo es que te dejes de hacer nada. Antes aprende lo básico y elemental, luego los fundamentos del lenguaje en que quieras programar...  y ya entonces cuando tengas que preguntar algo, además de saber hacerlo con propiedad podrás entender la ayuda que se te preste y aplicarla. Sin esto, es perder el tiempo.


Título: Re: 7-ZIp
Publicado por: rigorvzla en 23 Noviembre 2017, 23:39 pm
  :) entendido gracias por la respuesta , lo tendre en cuenta, yseguire con mi investigacion  ;)


Título: Re: 7-ZIp
Publicado por: Eleкtro en 24 Noviembre 2017, 10:53 am
No me apetece seguir interviniendo en este tema pero es que he visto algo que me descasilla por completo...

Citar
volviendo al tema encontre un ejemplo en internet muy bueno mas no se ahora como adaptarlo a mi codigo

Está claro que, aunque digas lo contrario no te has leido ni por asomo la última respuesta que te ofrecí en este thread con el código que te mostré en C# para que puedas resolver el problema, por que ahora has encontrado por Internet varios códigos parecidos al que yo te mostré, basados en el uso del objeto Shell para iterar las ventanas del explorar de Windows, que practicamente hacen lo mismo que mi código solo que con leves diferencias, y esos códigos que encontraste por Internet a diferencia del que yo te mostré, dices que los consideras buenos, y que los has intentado aplicar, vamos, en general les has dado más valor que cuando yo te ofrecí ese mismo tipo de solución y te dejé escrito en C# un código de ejemplo completo y funcional, es que chico... vaya tela, vaya tela las cosas que estás diciendo, como puedes despreciar o infravalorar cuando una persona te ofrece un código, y luego buscar 3 "copias" de ese mismo código en Internet y decir que son buenos códigos, no lo entiendo, un código preferiste no intentar usarlo, es decir, mi código, pero luego intentas usar 3 copy&paste que son practicamente lo mismo que mi código, el que preferiste no usar. Es ilógico.

Todo ese trabajo de investigación podrías habértelo ahorrado si hubieses leido mi respuesta, valorado el código que te mostré en C#, intentado usar el código, y si hubieras preguntado como usarlo en caso de duda o cualquier otra duda que hubieras tenido al respecto. En vez de eso lo que hiciste fue deshechar el código que te ofrecí por que el código y la respuesta te parecía "tediosa" de leer, luego te pusiste a investigar por internet soluciones por tu cuenta, y encontraste varias "copias" del mismo código que yo te mostré y dijiste "¡qué buenos códigos enconré!, esto seguro que me sirve".

¿Entiendes lo que quiero decir?. La solución que buscas siempre la has tenido aquí, en la primera página de este thread, en el código que te mostré en C#, aunque a ti te de por creer que esa solución es peor que esos otros 3 códigos que encontraste por Internet, no, en realidad es "lo mismo".

Si realmente no eres capaz de distinguir las diferencias entre el código que yo te mostré y los códigos que tú encontraste por Internet (los primeros 3 o 4 códigos que mostraste en tu última respuesta), y darte cuenta que en esencia todos esos códigos son "lo mismo", entonces tenemos un problema. Ya te expliqué que todo esto en mi humilde opinión te podría resultar confuso o avanzado para el nivel de aprendizaje que posees actualmente, no es el momento adecuado para que intentes hacer esto. No tengo más que añadir a la sugerencia del compañero @NEBIRE.

Supongo que este comentario te parecerá muy tedioso de leer, ya que he escrito bastante, pero me es indiferente, si quieres leer por tu bien, lee, sino, pues tú sabrás lo que haces.

Saludos.


Título: Re: 7-ZIp
Publicado por: okik en 25 Noviembre 2017, 19:55 pm
Hola

Como te dije los códigos de @Elektro (o de cualquiera) aunque no sean lo que buscamos o incluso aunque no nos funcionen sirven de guía o indican de alguna manera el camino.

Tras examinar el código de @Elektro el cual establece un enlace entre Explorer.exe y nuestra apliación, no me funcionaba entre otras por errores en  las líneas,

IEnumerable<string> filepath = (from item in itemsitem.Path);

 ShellWindows windows = (ShellWindows)((IShellDispatch6)shell).Windows();


Entonces decidí buscar alguna alternativa más simple, que al final ha sido esta:

NOTA:
Para que funciona
- Dirígete a "Agregar Referencia..." y agrega las librerías:
 
c:\windows\system32\shdocvw.dll
c:\windows\system32\shell32.dll

- Coloca un objeto Timer y un TextBox


Ejecuta el código, con la ventana abierta ejecuta el código y abre el explorador de windows.


Código
  1. using System;
  2. using System.Windows.Forms;
  3. using SHDocVw;
  4. namespace WindowsFormsApplication1
  5. {
  6.    public partial class Form1 : Form
  7.    {
  8.        public Form1()
  9.        {
  10.            InitializeComponent();
  11.        }
  12.  
  13.        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  14.        {
  15.  
  16.        }
  17.        private void Form1_Load(object sender, EventArgs e)
  18.        {
  19.            //propiedades para los objetos
  20.         this.textBox1.Multiline=true;
  21.         this.timer1.Enabled = true; //activa el timer (por defecto enabled = false)
  22.         this.textBox1.Size = new System.Drawing.Size(500, 40);
  23.         this.textBox1.Top = 10;
  24.         this.textBox1.Left = 10;
  25.         this.Size = new System.Drawing.Size(600, 100);
  26.  
  27.            //Mantiene la ventana siempre visible
  28.         Form instance = this;
  29.         instance.TopMost = true;
  30.        }
  31.  
  32.        private void timer1_Tick(object sender, EventArgs e)
  33.        {
  34.            textBox1.Text = GetPathSelectExplorer();
  35.  
  36.        }
  37.  
  38.        //Función que retorna el directorio seleccionador desde Explorer.exe
  39.        public string GetPathSelectExplorer()
  40.        {
  41.            SHDocVw.ShellWindows objShellWindows = new SHDocVw.ShellWindows();
  42.            try
  43.            {
  44.                foreach (SHDocVw.InternetExplorer Explorer in objShellWindows)
  45.                {
  46.                    Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)Explorer.Document).SelectedItems();
  47.                    foreach (Shell32.FolderItem item in items)
  48.                    {
  49.                       return item.Path;
  50.                    }
  51.                }
  52.            }
  53.            catch (Exception ex)
  54.            {
  55.                ex.Source = null;
  56.            }
  57.            return null;
  58.        }
  59.  
  60.  
  61.    }
  62. }
  63.  



La funcion en este código que devuelve la ruta o directorio de un archivo o carpeta es esta :

Código
  1.        //Función que retorna el directorio seleccionado en Explorer.exe
  2.        public string GetPathSelectExplorer()
  3.        {
  4.            SHDocVw.ShellWindows objShellWindows = new SHDocVw.ShellWindows();
  5.            try
  6.            {
  7.                foreach (SHDocVw.InternetExplorer Explorer in objShellWindows)
  8.                {
  9.                    Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)Explorer.Document).SelectedItems();
  10.                    foreach (Shell32.FolderItem item in items)
  11.                    {
  12.                       return item.Path;
  13.                    }
  14.                }
  15.            }
  16.            catch (Exception ex)
  17.            {
  18.                ex.Source = null;
  19.            }
  20.            return null;
  21.        }
  22.  

Pero vamos yo sigo opinando que tener que crear este enlace con Explorer.exe me parece poco elegante, es mejor un cuadro de diálogo o navegador de archivos desde tu propia aplicación, como hacen la mayoría de compresores conocidos.




y aqui otro codigo que encontre mas simple y a simple vista mia resulta de la misma manera

Código:
//case "comprimir":

                //    string file_name = string.Empty;

                //    OpenFileDialog openFileDialog1 = new OpenFileDialog();

                //    if (openFileDialog1.ShowDialog() == DialogResult.OK)
                //    {
                //        string dir = @openFileDialog1.FileName();
                //      string destino = Path.GetFileName(dir);


                //    }
                //    string sourceName = " ";
                //    string targetName = @"\Temp\Example.7z";
                //    ProcessStartInfo p = new ProcessStartInfo();
                //    p.FileName = "7za.exe";
                //    p.Arguments = "a -t7z \"" + targetName + "\" \"" +
                //        sourceName + "\" -mx=9";
                //    p.WindowStyle = ProcessWindowStyle.Hidden; Process x = Process.Start(p);
                //    x.WaitForExit();

¿Acaso te has molestado en ver mi respuesta anterior que hace eso mismo, abrir un cuadro de diálogo y al seleccionar un archivo o archivos los comprime?

Ya te vale  :¬¬


Título: Re: 7-ZIp
Publicado por: Eleкtro en 25 Noviembre 2017, 20:25 pm
Tras examinar el código de @Elektro el cual establece un enlace entre Explorer.exe y nuestra apliación, no me funcionaba entre otras por errores en  las líneas,

IEnumerable<string> filepath = (from item in itemsitem.Path);

 ShellWindows windows = (ShellWindows)((IShellDispatch6)shell).Windows();

Entonces decidí buscar alguna alternativa más simple, que al final ha sido esta:

NOTA:
Para que funciona
- Dirígete a "Agregar Referencia..." y agrega las librerías:
 
c:\windows\system32\shdocvw.dll
c:\windows\system32\shell32.dll

Eso viene a ser lo que yo dije (solo que de otro modo) al final de mi respuesta:

El código de arriba requiere una referencia a las sigueintes librerías COM:
  • Microsoft Internet Controls
  • Microsoft shell Controls And Automation

Obviando el hecho de que cometí un pequeño error ortográfico, eso debería ser una explicación suficiente de entender para alguien que tenga un mínimo de experiencia y progresión en el manejo de Visual Studio (estamos hablando de añadir una simple referencia a una librería, es básico y una tarea cotidiana), pero si uno no sabe hacerlo por que todavía no ha llegado a ese punto del aprendizaje de la IDE pues siempre puede preguntar como hacerlo, pero no, hay algunos que directamente prefieren no leer la respuesta, decir que es "tediosa" y no intentar nada... pues mal vamos. (si, sigo bastante molesto por el tema ese xD)

(https://i.imgur.com/njaFT82.png)  

(https://i.imgur.com/yoYFWQU.png)

(https://i.imgur.com/KTGbw9j.png)

Saludos


Título: Re: 7-ZIp
Publicado por: rigorvzla en 26 Noviembre 2017, 20:45 pm
muchas gracias a ambos por las respuestas y en efecto la respuesta esta aqui en los primeros post busque por otro lado algo q pudiera entender mejor y no por que no se entienda, esta bien explicado para alguien que sepa del tema a nivel alto, yo busque algo de manera mas facil para mi razonar (porfavor no quiero crear polemica de verdad), voy a ponerme manos  la obra en la implementacion, o adaptacion de este codigo al proyecto , y el afan de que sea asi es que la orden sera hablada por microfono "descomprimir o comprimir eso" y bueno pierde el sentido si se usa el click en el menu contextual , gracias nuevamente , y como dijo elektro, volvi al principio para leer e informarme mas del tema para que  todas sus explicaciones no me parescan simbolos egipcios.


Título: Re: 7-ZIp
Publicado por: rigorvzla 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 (http://imagizer.imageshack.us/v2/xq90/923/fOB7Bi.jpg[)
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

(http://imagizer.imageshack.us/v2/xq90/923/fOB7Bi.jpg) (https://imageshack.com/i/pnfOB7Bij)

(http://https://imageshack.com/i/pnfOB7Bij][IMG]http://imagizer.imageshack.us/v2/xq90/923/fOB7Bi.jpg[/img)

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


Título: Re: 7-ZIp
Publicado por: rigorvzla 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í:
  • https://sevenzipsharp.codeplex.com/SourceControl/latest (https://sevenzipsharp.codeplex.com/SourceControl/latest)

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


Título: Re: 7-ZIp
Publicado por: okik 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 (https://msdn.microsoft.com/es-es/library/system.diagnostics.process(v=vs.90).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1);
Código
  1. using System.Diagnostics;
  2.  

y

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


La clase OpenFileDialog (https://msdn.microsoft.com/es-es/library/system.windows.controls.openfiledialog(v=vs.95).aspx) 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 (https://msdn.microsoft.com/es-es/library/system.io(v=vs.110).aspx), 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"


Título: Re: 7-ZIp
Publicado por: rigorvzla en 27 Noviembre 2017, 16:59 pm
gracias manos a la obra dare respuesta de que resulto feliz inicio de semana


Título: Re: 7-ZIp
Publicado por: rigorvzla 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.


Título: Re: 7-ZIp
Publicado por: okik 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.

(https://i.ytimg.com/vi/FAg8bhB7dw4/hqdefault.jpg)

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.






Título: Re: 7-ZIp
Publicado por: rigorvzla 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.


Título: Re: 7-ZIp
Publicado por: okik 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.  





Título: Re: 7-ZIp
Publicado por: Eleкtro 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:
  • DispatcherTimer Class | docs.microsoft.com (https://docs.microsoft.com/en-us/dotnet/api/system.windows.threading.dispatchertimer?view=netframework-4.7.1)

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


Título: Re: 7-ZIp
Publicado por: rigorvzla 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.