Mostrando entradas con la etiqueta TreeView. Mostrar todas las entradas
Mostrando entradas con la etiqueta TreeView. Mostrar todas las entradas

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.

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