martes, 7 de julio de 2015

Receta C# No. 5-4: Cálculo del Tamaño de un Directorio

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 La propiedad Length de FileInfo
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

En la receta anterior aprendimos a copiar el contenido de un directorio a otro, para ello utilizamos una versión recursiva escrita por el programador y miembros de la clase DirectoryInfo. En esta oportunidad vamos a entender el proceso de cálculo del tamaño de un directorio: estoy incluye el cálculo de los archivos en el directorio raíz como también el de los subdirectorios.

1. Problema

Requerimos calcular el tamaño de todos los archivos almacenados en un directorio, e inclusive, el de los subdirectorios.

2. Solución

Para resolver este problema utilizaremos la propiedad FileInfo.Length para determinar el tamaño de cada archivo y totalizar la suma de todos ellos (esto implica el cálculo de archivos contenidos en el directorio raíz como también de aquellos localizados en los subdirectorios, si los hubiera).

3. Discusión de la Solución

3.1 La propiedad Length de FileInfo

La propiedad de sólo lectura Length [3] de la clase FileInfo [2] obtiene el tamaño de un archivo. Este tamaño está dado en bytes. Recordemos que este valor contenido en Length es una versión de caché y en caso de que el archivo haya sido modificado, y más adelante queramos obtener el valor real actual para ese archivo, debemos invocar el método Refresh [4] del objeto FileInfo.

Ejemplo de uso:


Sobre la línea 15 creamos un objeto DirectoryInfo y referenciamos la ruta C:\. Con la instrucción de la línea 19 obtenemos un arreglo de objetos FileInfo con las referencias a cada uno de los archivos del directorio en cuestión. Con el ciclo for mejorado foreach, líneas 23-26, mostramos el tamaño en bytes de cada uno de los archivos en C:\.

Compilación:


  1. csc /target:exe TamanioArchivoC.cs

Ejecución assembly:


  1. .\TamanioArchivoC.cs



> Prueba de ejecución (local):
Ejecución assembly TamanioArchivoC.exe.
Figura 1. Ejecución assembly TamanioArchivoC.exe.

4. Práctica: Código C#

Adaptaremos y localizaremos el ejemplo presentando en [1] para calcular el tamaño total de un directorio: archivos en la raíz y en los subdirectorios (si existieran).


En este ejemplo podemos resaltar las siguientes líneas de código:
  • Líneas 16-20: Valida que el usuario haya introducido un argumento desde la línea de comandos.
  • Línea 24: Creación de un objeto DirectoryInfo [5] con la ruta suministrada por el usuario de la aplicación.
  • Líneas 38-60: Declaración del método CalcularTamanioDirectorio(DirectoryInfo, bool):
    • Línea 42: Acumulador del tamaño de los archivos del directorio actual.
    • Líneas 45-48: Acumula el tamaño de cada uno de los archivos contenidos en el directorio actual.
    • Línea 51: Valida que el usuario haya pasado true para examinar subdirectorios.
    • Líneas 53-56: Ciclo foreach para examinar cada uno de los directorios del directorio actual.
  • Línea 59: Retorna el tamaño total de todos los archivos del directorio pasado como argumento por el usuario de la aplicación.
Compilación:

  1. csc /target:exe TamanioDirectorio.cs

Ejecución assembly:

  1. .\TamanioDirectorio.exe

> Prueba de ejecución (local):
Ejecución assembly TamanioDirectorio.exe
Figura 2. Ejecución assembly TamanioDirectorio.exe.

5. Conclusiones

En esta receta C# hemos aprendido cómo calcular el tamaño de los archivos contenidos en un directorio. De importante utilidad la propiedad FileInfo.Length: esta propiedad nos retorna el tamaño en bytes de un archivo. El método de cálculo de tamaño de los archivos en un directorio nos enseña que podemos hacer llamadas recursivas para escanear la estructura jerárquica de un directorio; y así obtener el tamaño total de los archivos de todos los subdirectorios.

6. Glosario

  • Archivo
  • Bytes
  • Directorio
  • Subdirectorio
  • Tamaño

7. Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: FileInfo Class (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.fileinfo%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
[3]: FileInfo.Length Property (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.fileinfo.length(v=vs.110).aspx
[4]: FileSystemInfo.Refresh Method (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.refresh(v=vs.110).aspx
[5]: DirectoryInfo Class (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.directoryinfo.aspx


M

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.