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.dll4. Seleccionas el DLL y pulsas
[Agregar]
Con este código (que ya puse antes) obtienes el directorio seleccionado desde el explorer.exe. de Windows.
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)
{
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.
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.:
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:
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.
foreach (Element in Object)
{
}
Es un bucle que recorre todos los elementos de una lista, matriz o colección.
OpenFileDialogAhora 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:
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)
{
using (OpenFileDialog ofd
= new OpenFileDialog
()) {
ofd.Title = "Archivos a comprimir";
ofd.Filter = "All files|*.*";
ofd.Multiselect = true;
if ((ofd.ShowDialog() == DialogResult.OK))
{
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
}//using
}//button1
}
}
EXPLICACIÓNLo primero es agregar la línea para usar la clase
Process;
using System.Diagnostics;
y
using System.Windows.Forms;
La clase
OpenFileDialog abre un cuadro de diálogo "Abrir".
Ejemplo:
using System.Windows.Forms;
...
using (OpenFileDialog ofd
= new OpenFileDialog
()) {
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 :
//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,
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
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();
donde
ofd.FileNames es una colección o lista de elementos seleccionados en el cuadro
OpenFileDialogCada 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:
System.IO.File.Delete("listfile.lst");
También puedes importar
System.IO, al principio de 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;
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"