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

No hay comentarios:

Publicar un comentario