Utilizando Linq para interactuar con el File System

Hoy veremos como podemos utilizar Linq como si de un lenguaje de scripting se tratara y realizar muchas operaciones de análisis del file system. En esta ocasión veremos algunas de ellas:

  • Obtener el tamaño total de todos los archivos dentro de un directorio específico
  • Encontrar archivos con el mismo nombre (duplicado posible)
  • Encontrar archivos duplicados exactos
  • Encontrar archivos modificados la última semana
  • Encontrar archivos de tamaño cero byte

 

  • Obtener el tamaño total de todos los archivos dentro de un directorio específico

Obtener el tamaño total de los archivos de un conjunto de subdirectorios y poder verlo en megabytes or gigabytes podría ser importante para entender el consumo de disco duro. Para obtener el tamaño total de un directorio específico, debemos calcular recursivamente el tamaño de todos los archivos en cada subdirectorio del directorio que hemos seleccionado. Podemos escribir un consulta Linq que liste el tamaño (medidos en megabytes) de todos los subdirectorios y archivos dentro de un directorio.

postlinq20170601_01

Llamando al método GetFiles con la opción SearchOption.AllDirectories retornamos el nombre completo de todos los archivos en todos los subdirectorios del directorio seleccionado. El sistema operativo representa el tamaño total de los archivos en bytes. Podemos devolver el tamaño de los archivos desde su propiedad Length. Dividiéndola por 1024 y elevándola a la potencia de 2 nos da el tamaño del archivo en megabytes. Como el directorio/carpeta puede contener muchos archivos d.Select (x => x.FileSize) retorna la colección de los tamaños de archivos medidos en megabytes. La ultima llamada a Sum() devuelve el tamaño total de los archivos en el directorio especificado.

  • Encontrar archivos con el mismo nombre (duplicado posible)

Alguna veces el mismo archivo esta copiado en multiples directorios. Sería interesante encontrar los archivos duplicados y borrar todas las copias innecesarias. El primer paso es encontrar todos los archivos que tienen el mismo nombre. Vale aclarar que solo porque dos archivos tengan el mismo nombre no necesariamente significa que están duplicados. Por ejemplo podemos tener dos aplicaciones instaladas y ambas utilizan un archivo Readme.txt. Pero el contenido de ambos archivos puede ser diferente.  Escribiremos una sentencia Linq para encontrar los archivos con el mismo nombre en diferentes directorios.

postlinq20170601_02

Lo primero que hace el código es mapear los archivos y sus directorios. Luego crea una tabla lookup usando el nombre de archivo como clave. El resultado es que para cualquier archivo cuyo nombre este duplicado en alguna carpeta o directorio, habrá al menos dos entradas para esa clave en particular. Estas entradas duplicadas son encontradas por el filtro Where (d => d.Count () >=2).

  • Encontrar archivos duplicados exactos

Esto seria una extension del caso anterior. Algunas veces se renombran archivos duplicados sin cambiar el contenido. Esto significaría que el mismo archivo  con diferentes nombres puede existir en diferentes carpetas. El caso anterior que hemos visto solo encuentra nombres duplicados, no archivos duplicados. Aquí veremos como encontrar archivos duplicados exactos aun si tienen nombres diferentes. Escribiremos una sentencia Linq para encontrar archivos duplicados con nombres diferentes, aun si los archivos duplicados residen en diferentes directorios.

postlinq20170601_06

Localizar archivos duplicados es un proceso que puede llevar tiempo, porque para determinar si el contenido de dos archivos son idénticos, necesitamos leer los archivos, crear un hashcode y luego comparar los hashcodes. Este ejemplo crea una tabla lookup usando los hashcodes de los archivos como la clave de la tabla. Si el resultado contiene dos o mas elementos para cualquier clave hashcode devuelta, entonces esos archivos son duplicados exactos.

  • Encontrar archivos modificados la última semana

Algunas veces podemos necesitar cuando un archivo fue accedido por última vez. Usando Linq podemos encontrar todos los archivos modificados dentro de la última semana.

postlinq20170601_07

SI un archivo es modificado, la  fecha de modificación de ese archivo cambia. Esto lo podemos utilizar para determinar si un archivo fue modificado y cuando fue el último cambio. Conociendo esto podemos encontrar todos los archivos donde la ultima fecha de modificación este entre los siete días a partir de la fecha actual con el siguiente filtro en la sentencia Linq.

postlinq20170601_08

  • Encontrar archivos de tamaño cero byte

Encontrar archivo de tamaño 0 bytes. Archivos sin nada generalmente no son útiles. Escribiremos una sentencia Linq para encontrar todos los archivos de tamaño 0 en un directorio específico y en todos sus subdirectorios.

postlinq20170601_09
En el código anterior encontramos los archivos de tamaño 0 bytes verificando si la propiedad Length del archivo es 0. GetFiles() retorna un array de strings conteniendo los nombres de los archivos, y el Select() devuelve esta lista como un IEnumerbale de FileInfo.

The following two tabs change content below.
Admin

Admin

Administrador de Dotnetuy, con más de 20 años de experiencia en el mundo de la informática y el desarrollo de software en diferentes lenguajes, trabajando en backend y frontend, desde sus primeros pasos con clipper cuando comenzaba la década de los 90’s , y continuando con pascal, C, C++, Visual basic, y multiples gestores de bases de datos hasta hoy en día con C# y todas las técnologias relacionadas con .NET.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *