7-ZIp

Iniciado por rigorvzla, 21 Noviembre 2017, 04:21 AM

0 Miembros y 2 Visitantes están viendo este tema.

rigorvzla

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

okik

#11
@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?


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

Serapis

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



rigorvzla

#13
@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 .

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

      [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

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

//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();

Serapis

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.

rigorvzla

  :) entendido gracias por la respuesta , lo tendre en cuenta, yseguire con mi investigacion  ;)

Eleкtro

#16
No me apetece seguir interviniendo en este tema pero es que he visto algo que me descasilla por completo...

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








okik

#17
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 (csharp) [Seleccionar]

using System;
using System.Windows.Forms;
using SHDocVw;
namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }

       private void Form1_FormClosing(object sender, FormClosingEventArgs e)
       {
 
       }
       private void Form1_Load(object sender, EventArgs e)
       {
           //propiedades para los objetos
        this.textBox1.Multiline=true;
        this.timer1.Enabled = true; //activa el timer (por defecto enabled = false)
        this.textBox1.Size = new System.Drawing.Size(500, 40);
        this.textBox1.Top = 10;
        this.textBox1.Left = 10;
        this.Size = new System.Drawing.Size(600, 100);

           //Mantiene la ventana siempre visible
        Form instance = this;
        instance.TopMost = true;
       }

       private void timer1_Tick(object sender, EventArgs e)
       {
           textBox1.Text = GetPathSelectExplorer();
         
       }

       //Función que retorna el directorio seleccionador desde Explorer.exe
       public string GetPathSelectExplorer()
       {
           SHDocVw.ShellWindows objShellWindows = new SHDocVw.ShellWindows();
           try
           {
               foreach (SHDocVw.InternetExplorer Explorer in objShellWindows)
               {
                   Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)Explorer.Document).SelectedItems();
                   foreach (Shell32.FolderItem item in items)
                   {
                      return item.Path;
                   }
               }
           }
           catch (Exception ex)
           {
               ex.Source = null;
           }
           return null;
       }


   }
}




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

Código (csharp) [Seleccionar]

       //Función que retorna el directorio seleccionado en Explorer.exe
       public string GetPathSelectExplorer()
       {
           SHDocVw.ShellWindows objShellWindows = new SHDocVw.ShellWindows();
           try
           {
               foreach (SHDocVw.InternetExplorer Explorer in objShellWindows)
               {
                   Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)Explorer.Document).SelectedItems();
                   foreach (Shell32.FolderItem item in items)
                   {
                      return item.Path;
                   }
               }
           }
           catch (Exception ex)
           {
               ex.Source = null;
           }
           return null;
       }


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.





Cita de: rigorvzla en 23 Noviembre 2017, 17:35 PM
y aqui otro codigo que encontre mas simple y a simple vista mia resulta de la misma manera

//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  :¬¬

Eleкtro

#18
Cita de: okik en 25 Noviembre 2017, 19:55 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:

Cita de: Eleкtro en 21 Noviembre 2017, 20:33 PM
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)

 





Saludos








rigorvzla

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.