17 abril 2010

Cómo en C# obtener el tamaaño de un directorio

Esta misma función la escribí en el post anterior, pero creo necesario volverla a escribir porque puede ser útil al márgen de la otra utilidad que le dí.

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;

}


Por su puesto, gracias a quién colgó por internet este código, del que yo no he cambiado nada.

Saludos

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

16 abril 2010

C#: Insertar datos en un GriedView sin origen en base de datos

Fue fácil pero apunto esto para un futuro y para el que lo necesite. ste es un ejemlo, de cómo cargar un objeto GridView se carga sin etar enlazado a una Base de datos de atos, en este caso pertenecientes a un ArrayList.


/*Se carga una rejilla a traves de los datos del ArrayList Peliculas*/

Pelicula unaPeli = new Pelicula(TxtTitulo.Text, TxtGenero.Text);
//objeto de Tipo Pelicula
Peliculas.Add(unaPeli); //Peliculas es un arryList


/*Creación del objeto otabla en donde se van a ir agregando uno a uno los elementos del ArrayList*/
DataTable oTabla = new DataTable(); //objeto DataTable
DataColumn oColumTitulo= new DataColumn("Titulo"); //objeto DataColumn
DataColumn oColumGenero = new DataColumn("Genero"); //objeto DataColumn

oTabla.Columns.Add(oColumTitulo); //se añaden esas columnas
oTabla.Columns.Add(oColumGenero);


int tam = Peliculas.Count; //Arrayist
for (int i = 0; i <>
{
unaPeli = (Pelicula) Peliculas[i];
string[] strFila = new string[2];
strFila[0] = unaPeli.Titulo;
strFila[1] = unaPeli.Genero;
oTabla.Rows.Add(strFila); //se añad una nueva fila
}


GrdVPeliculas.DataSource= oTabla; //se le asigna el origen
GrdClmTitulo.FieldName= oColumTitulo.ColumnName;
GrdClmGenero.FieldName = oColumGenero.ColumnName;


Espero no ser muy ilegible, jejejej.

Saludos.

Cómo en C# se ordena el código

Lo vi en un compañero del curro y me gustó mucho. Utilizar regiones es la clave. Habrá regiones para cada ámbito de archivo (clases, códigos de formularios, etc.), por ejemplo: para las variables, constructores, eventos, funciones, propiedades, y así según hagan falta.
En C Sharp las rgiones comienzan escribiendo #region nombre_de_la_región y terminan escribiendo #endregion. En las líneas de enmedio se esrcirbe el código ejecutable.
Dividir en regiones resulta ventajoso pues el código encasillado se ve a simple vista, al mismo tiempo que si se quiere se puede ocultar con un simple click en la cruz que se dibuja nada más se abre la región.

Saludos de este Victor.

15 abril 2010

Los hilos en C#, breve presentacion


Partiendo de que se cónoce qué es un hilo (thread), voy a comentar cómo se usan en este lenguaje.

Lo primero: importar Threading, using System.Threading;
Después, si ya se tiene hecha la función (procedimiento) que se quiere ejecutar en background, se hace esto: Thread hilo = new Thread(nmbre_procedimiento) Bien, las funciones no pueden tener parámetros, o al menos, aún no he visto un ejemplo donde se ejecute un hilo cuya función los tenga. Además los hilos no pueden trabajar con controles de diseño. Así que hay que ser pillo y quebrarse la cabeza con trucos.
En tercer lugar se indica que se desarrollará es Background: hilo.isBackground=true;
Cuarto, el hilo se pone en marcha con el metodo Start();
Quinto, para provocar intervalos sin actividad: Hilo.Sleep(num_milisegundos);


Y hasta aquí una resumida introducción.


Saludos.

08 abril 2010

Quireo mi pc limpio de polvo y paja


Eso, y estar con mi Claudia, siempre, bien.

Pasos para cepillarme el Windows XP de mi ordenador, para volver a reinstalarlo, pero habiendo formateado:

1. Entonces es facil, solo necesitas un disco de windows xp y los drivers para instalarlos despues de formatear y volver a instalar windows.

2. Metes el disco de windows xp nada mas encender el pc, y en la configuracion de la bios, el orden de booteo lo tienes que tener para que lea primero el cd y luego ya el discoduro miras que este eso bien, se reinicia y despues se mete directamente en el arranque del cd de windows.

3. Te cargan unas cuantas cosas y te salen las particiones que tienes y cuanta capacidad tiene cada particion y en el mismo sitio te dice como eliminar particiones, como crear nuevas y como instalar windows. Si no hay particiones, entonces solo te saldra una, con la capacidad total del disco duro...

4. Luego puedes hacer dos cosas, eliminarla y volver a crearla(eso se suele hacer si quieres mas de una particion) o directamente darle a intro y despues te salen las opciones de formateo...le das a ntfs normal(porque tambien te sale el rapido) y ya solo se encarga de formatear e instalar windows una vez que termina de instalar, que es lo que mas tarda.....ya cuando estes en el escritorio con el ordenador limpio de mierda, le metes los drivers de la placa base, tarjeta grafica, sonido, etc.... y ya esta.

Estos pasos me los ha dado mi compañera de ASI Esther.



Anexo anexado a los dos días de haber catado "Eureka!" :

En caso de que surja un error en la detección de disco duro, particiones, al ir a instalar Windows XP de nuevas, se debe hacer esto:
1. Entrar en la BIOS (para poder acceder hay que pulsar "como loco" mientras el sistema arranca F2, en mi caso.
2. Ya dentro, hay que desabilitar el RAID pues seguramente el fallo se produjese porque en el CD de instalación no van incorporados los drivers para manejar discos SCSI
.
3. Reniciar y cruzar los dedos para que ahora si se pueda lograr el objetivo.

Este consejo se lo debo a mi colega Miguel

1 abrazo