Basandome en En C#: Cómo montar un navegador en un TreeView ( 2º versión) hice los apaños necesarios para que ahora me sacara los subdirectorios del direwctorio raiz llamado Documentos y ubicado dentro de la carpeta Debug del proyecto. Algo que se hace así:
Application.StartupPath + "\\Documentos";
Si, y es esa barra, y no esta /. Aviso porque luego la piciamos confundiendonos con Linux.
Las diferencias enrtre un proyecto y otro son:
1. Ahora cargo el contenido de una carpeta, sus subdirectorios. Utilizando como nodo-raiz uno que tenga por ruta la ruta-inicial, que vale la concatenación de Application.StartupPath más el nombre del directorio raiz. Para el nombre del nodo-raiz, poodemos usar la \tipica o el nombre de la carpeta contanedora. Anteriormente, en la segunda versión, usabamos una función que cargaba los drivers, ahora no, ahora cargamos los subdirectorios. Así:
public void Inicio2()
{
//lo primero, cargsr el contenido de la carpeta raiz
rutaInicial = Application.StartupPath + "\\Documentos";
DirectoryInfo dirInf = new DirectoryInfo(rutaInicial);
try
{
foreach (DirectoryInfo subdir in dirInf.GetDirectories())
{
//de cada directorio se obtiene el nombre y el fullname y se convierte a nodo. El nodo se agrega al principal
SuperTreeNode nodo = new SuperTreeNode();
nodo.Text = subdir.Name;
nodo.Ruta = subdir.FullName;
NodoRaiz.Nodes.Add(nodo);
StateLblInformacion.Text = "";
}
}
catch (Exception ex)
{
//en la barra de estado uestro los errores q se pueden gnerar (falta de derechos o unidad no lista)
StateLblInformacion.Text = ex.Message;
}
}
2. La otra diferencia importante, no es nada del otro mundo: deshabilitar el botón que permite suprimir un directorio y la opción del menú contextual. Y esto se hace en el evento AfterSelect del control TreeView. Así:
if (NodoSeleccionado.Ruta.CompareTo(NodoRaiz.Ruta) == 0)
BtnBorrarDirectorio.Enabled = false;
else
BtnBorrarDirectorio.Enabled = true;
MenuItemBorrarDirectorio.Enabled = BtnBorrarDirectorio.Enabled;
Saludos.
Mostrando entradas con la etiqueta Navegador de directorios. Mostrar todas las entradas
Mostrando entradas con la etiqueta Navegador de directorios. Mostrar todas las entradas
26 septiembre 2010
02 mayo 2010
En C#: Cómo montar un navegador en un TreeView ( 2º versión)
Para desarrollar esta segunda versión, que sustituye, mejorando a "Más código en C#: Cómo montar un navegador en un TreeView", cree una clase. La llamé "SuperTreeNode" y hereda todo de la clase "TreeNode" perteneciente a System.Windows.Forms.
Código de la clase SuperTreeNode:
class SuperTreeNode:TreeNode //los dos puntos preceden a la clase superior
{
private string ruta;
public SuperTreeNode()
: base()
{
this.ruta = "";
}
public SuperTreeNode(string ruta)
: base()
{
this.ruta = ruta;
}
public SuperTreeNode(string texto, string ruta):base(texto)
{
this.ruta = ruta;
}
public string Ruta
{
get { return ruta; }
set { ruta = value; }
}
}
El código de la clase donde se realizan las funciones relativas a la carga de los directorios, en esta versión, se cargan cuando se procede a utilizarlos, resolviendo asi el problemas con la memoria RAM, que antes se veia afectada.
Código de la clase del formulario principal, donde uso System.IO;:
public partial class Form1 : Form
{
SuperTreeNode NodoRaiz;
public Form1()
{
InitializeComponent();
NodoRaiz = new SuperTreeNode();
NodoRaiz.ImageIndex = 0;
NodoRaiz.Text = "MI PC"; //doy un texto al nodo primario
TreeVArboleda.Nodes.Add(NodoRaiz); //el nodoprimario lo agrego al arbol
}
private void Form1_Load(object sender, EventArgs e)
{
Inicio();
TreeVArboleda.ExpandAll();
}
public void Inicio()
{
//lo primero, sacar las unidades.
DriveInfo[] drivers = DriveInfo.GetDrives();//se obtienen todos los drivers
foreach (DriveInfo driver in drivers)
{
try
{
//de cada driver se obtiene el nombre y el fullname y se convierte a nodo. El nodo se agrega al principal
SuperTreeNode nodo = new SuperTreeNode();
nodo.Text = driver.Name; //nombre
nodo.Ruta = driver.RootDirectory.FullName; //ruta
NodoRaiz.Nodes.Add(nodo);
StateLblInformacion.Text ="";
}
catch (Exception ex)
{
StateLblInformacion.Text = ex.Message;
}
}
}
private void TreeVArboleda_AfterSelect(object sender, TreeViewEventArgs e)
{
SuperTreeNode nodo = (SuperTreeNode)e.Node;
TxtRutaActual.Text = nodo.Ruta; //obtengo la ruta seleccionada
try
{
//obtengo el contenido (subdirectorios) del directorio de la ruta
DirectoryInfo unDirectorio = new DirectoryInfo(TxtRutaActual.Text);
DirectoryInfo[] subdirectorios = unDirectorio.GetDirectories();
nodo.Nodes.Clear();
foreach (DirectoryInfo directorios in subdirectorios)
{
try
{
//por cada subdirectorio cro un nodo llamado hijo al que anclo al nodo creado al principio
SuperTreeNode hijo = new SuperTreeNode(directorios.Name, directorios.FullName);
nodo.Nodes.Add(hijo);
StateLblInformacion.Text = "";
}
catch (Exception ex2)
{
StateLblInformacion.Text = ex2.Message;
}
}
}
catch (Exception ex)
{
StateLblInformacion.Text = ex.Message;
}
}
}
}
Saludos.
Código de la clase SuperTreeNode:
class SuperTreeNode:TreeNode //los dos puntos preceden a la clase superior
{
private string ruta;
public SuperTreeNode()
: base()
{
this.ruta = "";
}
public SuperTreeNode(string ruta)
: base()
{
this.ruta = ruta;
}
public SuperTreeNode(string texto, string ruta):base(texto)
{
this.ruta = ruta;
}
public string Ruta
{
get { return ruta; }
set { ruta = value; }
}
}
El código de la clase donde se realizan las funciones relativas a la carga de los directorios, en esta versión, se cargan cuando se procede a utilizarlos, resolviendo asi el problemas con la memoria RAM, que antes se veia afectada.
Código de la clase del formulario principal, donde uso System.IO;:
public partial class Form1 : Form
{
SuperTreeNode NodoRaiz;
public Form1()
{
InitializeComponent();
NodoRaiz = new SuperTreeNode();
NodoRaiz.ImageIndex = 0;
NodoRaiz.Text = "MI PC"; //doy un texto al nodo primario
TreeVArboleda.Nodes.Add(NodoRaiz); //el nodoprimario lo agrego al arbol
}
private void Form1_Load(object sender, EventArgs e)
{
Inicio();
TreeVArboleda.ExpandAll();
}
public void Inicio()
{
//lo primero, sacar las unidades.
DriveInfo[] drivers = DriveInfo.GetDrives();//se obtienen todos los drivers
foreach (DriveInfo driver in drivers)
{
try
{
//de cada driver se obtiene el nombre y el fullname y se convierte a nodo. El nodo se agrega al principal
SuperTreeNode nodo = new SuperTreeNode();
nodo.Text = driver.Name; //nombre
nodo.Ruta = driver.RootDirectory.FullName; //ruta
NodoRaiz.Nodes.Add(nodo);
StateLblInformacion.Text ="";
}
catch (Exception ex)
{
StateLblInformacion.Text = ex.Message;
}
}
}
private void TreeVArboleda_AfterSelect(object sender, TreeViewEventArgs e)
{
SuperTreeNode nodo = (SuperTreeNode)e.Node;
TxtRutaActual.Text = nodo.Ruta; //obtengo la ruta seleccionada
try
{
//obtengo el contenido (subdirectorios) del directorio de la ruta
DirectoryInfo unDirectorio = new DirectoryInfo(TxtRutaActual.Text);
DirectoryInfo[] subdirectorios = unDirectorio.GetDirectories();
nodo.Nodes.Clear();
foreach (DirectoryInfo directorios in subdirectorios)
{
try
{
//por cada subdirectorio cro un nodo llamado hijo al que anclo al nodo creado al principio
SuperTreeNode hijo = new SuperTreeNode(directorios.Name, directorios.FullName);
nodo.Nodes.Add(hijo);
StateLblInformacion.Text = "";
}
catch (Exception ex2)
{
StateLblInformacion.Text = ex2.Message;
}
}
}
catch (Exception ex)
{
StateLblInformacion.Text = ex.Message;
}
}
}
}
Saludos.
17 abril 2010
Más código en C#: Cómo montar un navegador en un TreeView
Para implementar este código utilicé una clase, que llamé ExploradorLocal. Para su programación he usado clase IO y Windows.Forms, donde la primera se usa para el manejo de archivos y directorios. Y la otra sirve para manipular TreeView y TreeNode, clases que usaremos para el árbol, donde la segunda, es obviamente la que crea nodos dependientes del árbol.
Esta clase cuenta cobn un objeto ArrayList que es Contenedor y que contiene el contenido del directorio. También trabajo con la clase ContenidoDirectorio, la cual tiene como variables nombre, tipo, ultima fecha de acceso y peso. Las tres primeras del tipo string, y la cuarta long. En el ArrayList se meterá cada componente conforme se vaya leyendo el contenido del directorio, y esto sucede enla tercera de la funciones (métodos si usamos la nomenclatura de POO).
La primera función, ExtraerEstructuraUnidades() , devuelve un objeto TreeView, donde ya se "cargaron" todas las ramificacones del arbol. Esta función se ocupa de encontrar las unidades (drivers).
public TreeView ExtraerEstructuraUnidades()
{
/*Extrae las unidades*/
try
{
oTree.Nodes.Clear();
DriveInfo[] TodosLosDrivers = DriveInfo.GetDrives();
foreach (DriveInfo driver in TodosLosDrivers)
{
TreeNode node = new TreeNode();
node.Text = driver.Name;
oTree.Nodes.Add(node);
ExtraerEstructuraDirectorios(driver.Name, node, 0);
}
}
catch (Exception ex)
{
ex.ToString();
}
return oTree;
}
La siguiente, que es recursiva tiene por finalidad, extraer los directorios que cuelgan de la ruta especificada. Superior es el nodo superior, y nivel es una variable que hace de tope, impidiendo el bucle infinito.
private void ExtraerEstructuraDirectorios(string ruta, TreeNode superior, int nivel)
{
/*Extrae el contenido de cada unidad (solo directorios)*/
try
{
nivel++;
if (nivel == 4)
return;
DirectoryInfo dir = new DirectoryInfo(ruta);
if (!dir.Exists)
Console.WriteLine("No se puede acceder a: " + ruta);
foreach(DirectoryInfo dirInfo in dir.GetDirectories())
{
TreeNode child = new TreeNode();
child.Text = dirInfo.Name;
superior.Nodes.Add(child);
ExtraerEstructuraDirectorios(child.FullPath, child, nivel);
}
}
catch (Exception ex)
{
Console.WriteLine("Ha surgido un problema: " +ex.Message);
}
}
En esta tercera función se extrae el contenido del directorio actual, aarchivos y subdirectorios, para luego, y aunque aquí no se vea, cargar su información en un objeto GridView.
public void ObtenerContenidoDirectorio()
{
/*Extrae el contenido de cada directorio (subdirectorios y ficheros)*/
Contenedor.Clear(); //borrado del arraylist
try
{
// miro si la ruta existe
DirectoryInfo dir = new DirectoryInfo(rutaSeleccionada);
if (!dir.Exists)
Console.WriteLine("El directorio " + rutaSeleccionada + " no existe.");
// lista del contenido
foreach (DirectoryInfo di in dir.GetDirectories())
{
//se obtiene el peso en bytes del subdirectorio
long peso = ObtenerPesoDirectorioEnBytes(di);
//oContenido contiene un elemento del directorio
Clases.ContenidoDirectorio oContenido = new Proyecto .Clases.ContenidoDirectorio(di.Name, "Subdirectorio", Convert.ToString(di.LastWriteTime), peso);
//Contenedor contiene muchos oContenido
Contenedor.Add(oContenido);
}
// fill the Files listbox
foreach (FileInfo fi in dir.GetFiles())
{
Clases.ContenidoDirectorio oContenido = new Proyecto.Clases.ContenidoDirectorio(fi.Name, fi.Extension, Convert.ToString(fi.LastWriteTime), fi.Length);
Contenedor.Add(oContenido);
}
}
catch (Exception ex)
{
ex.ToString();
}
}
En esta cuarta función se extrae el peso en bytes de un directorio (pasado por parametro).
private long ObtenerPesoDirectorioEnBytes(DirectoryInfo d)
{
long pesoDir = 0;
try
{
// Totalizar tamaño de archivos
FileInfo[] fis = d.GetFiles();
foreach (FileInfo fi in fis)
{
pesoDir += fi.Length;
}
// Totalizar tamaño sub-directorios
DirectoryInfo[] dis = d.GetDirectories();
foreach (DirectoryInfo di in dis)
{
pesoDir += ObtenerPesoDirectorioEnBytes(di);
}
}
catch (Exception exp)
{
// Código para la excepción va aquí
}
return pesoDir;
}
Para realizar este proyecto, cuya idea es imitar a Filezilla, estoy utilizando código encontrado pr Internet, así pues gracias a aquellos que me ilustran.
Saludos
Esta clase cuenta cobn un objeto ArrayList que es Contenedor y que contiene el contenido del directorio. También trabajo con la clase ContenidoDirectorio, la cual tiene como variables nombre, tipo, ultima fecha de acceso y peso. Las tres primeras del tipo string, y la cuarta long. En el ArrayList se meterá cada componente conforme se vaya leyendo el contenido del directorio, y esto sucede enla tercera de la funciones (métodos si usamos la nomenclatura de POO).
La primera función, ExtraerEstructuraUnidades() , devuelve un objeto TreeView, donde ya se "cargaron" todas las ramificacones del arbol. Esta función se ocupa de encontrar las unidades (drivers).
public TreeView ExtraerEstructuraUnidades()
{
/*Extrae las unidades*/
try
{
oTree.Nodes.Clear();
DriveInfo[] TodosLosDrivers = DriveInfo.GetDrives();
foreach (DriveInfo driver in TodosLosDrivers)
{
TreeNode node = new TreeNode();
node.Text = driver.Name;
oTree.Nodes.Add(node);
ExtraerEstructuraDirectorios(driver.Name, node, 0);
}
}
catch (Exception ex)
{
ex.ToString();
}
return oTree;
}
La siguiente, que es recursiva tiene por finalidad, extraer los directorios que cuelgan de la ruta especificada. Superior es el nodo superior, y nivel es una variable que hace de tope, impidiendo el bucle infinito.
private void ExtraerEstructuraDirectorios(string ruta, TreeNode superior, int nivel)
{
/*Extrae el contenido de cada unidad (solo directorios)*/
try
{
nivel++;
if (nivel == 4)
return;
DirectoryInfo dir = new DirectoryInfo(ruta);
if (!dir.Exists)
Console.WriteLine("No se puede acceder a: " + ruta);
foreach(DirectoryInfo dirInfo in dir.GetDirectories())
{
TreeNode child = new TreeNode();
child.Text = dirInfo.Name;
superior.Nodes.Add(child);
ExtraerEstructuraDirectorios(child.FullPath, child, nivel);
}
}
catch (Exception ex)
{
Console.WriteLine("Ha surgido un problema: " +ex.Message);
}
}
En esta tercera función se extrae el contenido del directorio actual, aarchivos y subdirectorios, para luego, y aunque aquí no se vea, cargar su información en un objeto GridView.
public void ObtenerContenidoDirectorio()
{
/*Extrae el contenido de cada directorio (subdirectorios y ficheros)*/
Contenedor.Clear(); //borrado del arraylist
try
{
// miro si la ruta existe
DirectoryInfo dir = new DirectoryInfo(rutaSeleccionada);
if (!dir.Exists)
Console.WriteLine("El directorio " + rutaSeleccionada + " no existe.");
// lista del contenido
foreach (DirectoryInfo di in dir.GetDirectories())
{
//se obtiene el peso en bytes del subdirectorio
long peso = ObtenerPesoDirectorioEnBytes(di);
//oContenido contiene un elemento del directorio
Clases.ContenidoDirectorio oContenido = new Proyecto .Clases.ContenidoDirectorio(di.Name, "Subdirectorio", Convert.ToString(di.LastWriteTime), peso);
//Contenedor contiene muchos oContenido
Contenedor.Add(oContenido);
}
// fill the Files listbox
foreach (FileInfo fi in dir.GetFiles())
{
Clases.ContenidoDirectorio oContenido = new Proyecto.Clases.ContenidoDirectorio(fi.Name, fi.Extension, Convert.ToString(fi.LastWriteTime), fi.Length);
Contenedor.Add(oContenido);
}
}
catch (Exception ex)
{
ex.ToString();
}
}
En esta cuarta función se extrae el peso en bytes de un directorio (pasado por parametro).
private long ObtenerPesoDirectorioEnBytes(DirectoryInfo d)
{
long pesoDir = 0;
try
{
// Totalizar tamaño de archivos
FileInfo[] fis = d.GetFiles();
foreach (FileInfo fi in fis)
{
pesoDir += fi.Length;
}
// Totalizar tamaño sub-directorios
DirectoryInfo[] dis = d.GetDirectories();
foreach (DirectoryInfo di in dis)
{
pesoDir += ObtenerPesoDirectorioEnBytes(di);
}
}
catch (Exception exp)
{
// Código para la excepción va aquí
}
return pesoDir;
}
Para realizar este proyecto, cuya idea es imitar a Filezilla, estoy utilizando código encontrado pr Internet, así pues gracias a aquellos que me ilustran.
Saludos
Suscribirse a:
Entradas (Atom)