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
try { foreach (SHDocVw.InternetExplorer Explorer in objShellWindows) { Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)Explorer.Document).SelectedItems(); foreach (Shell32.FolderItem item in items) { textBox1.Text= item.Path; } } } catch (Exception ex) { ex.Source = null; } return null;
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
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Diagnostics; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { { ofd.Title = "Archivos a comprimir"; ofd.Filter = "All files|*.*"; ofd.Multiselect = true; if ((ofd.ShowDialog() == DialogResult.OK)) { //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\\"; 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 }//using }//button1 } }
EXPLICACIÓN
Lo primero es agregar la línea para usar la clase Process;
Código
using System.Diagnostics;
y
Código
using System.Windows.Forms;
La clase OpenFileDialog abre un cuadro de diálogo "Abrir".
Ejemplo:
Código
using System.Windows.Forms; ... { ofd.Title = "Archivos a comprimir"; ofd.Filter = "All files|*.*"; ofd.Multiselect = true; ofd.ShowDialog(); }
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
//Si se pulsa el botón OK... if ((ofd.ShowDialog() == DialogResult.OK)) { ... }
Como el cuadro de diálogo que he creado tiene activa la opción MULTISELECT,
Código:
ofd.Multiselect = true;
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
//Crea una lista de archivos foreach (string n in ofd.FileNames) { sw.WriteLine(n); }//foreach sw.Close();
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
System.IO.File.Delete("listfile.lst");
También puedes importar System.IO, al principio de código;
Código
using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Diagnostics; using System.IO; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() ...
y luego poner solamente;
Código
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"