manejar-archivos-y-directorios-en-c

Manejar archivos y directorios en C#

Como programadores una de las tareas que con mayor frecuencia necesitamos abordar es la manipulación de ficheros y directorios. Crear, mover, copiar y borrar archivos y directorios son tareas habituales en la programación o automatización de tareas.

Si bien el Framework.NET nos proporciona una enorme biblioteca de funciones para manipular ficheros y directorios, estas son funciones básicas diseñadas para que construyamos y ensamblemos de nuestros propios programas.

Si queremos hacer tareas más complejas, como por ejemplo copiar un directorio completo con todas sus subcarpetas y directorios, tendremos que programar nuestras propias funciones.

En esta ocasión comparto con vosotros una librería de funciones para manipular ficheros y archivos en C#. Las funciones siguen siendo simples, y seguramente tengáis que modificarlas según vuestras necesidades. Pero puede que os ahorren tiempo, o que os sirvan como punto de partida para vuestras propias funciones.

Entra las funciones disponibles están:

  • Crear un fichero vacío
  • Crear un directorio vacío
  • Borrar un archivo
  • Borrar el contenido de un directorio
  • Borrar un directorio y su contenido
  • Copiar un archivo
  • Copiar el contenido de un directorio
  • Copiar un directorio y su contenido

La función para copiar archivo permite indicar si deseamos sobreescribir o no el archivo en destino.

De forma similar, la función copiar directorio y contenido permite indicar si se desea sustituir por completo el directorio de destino, o solamente reemplazar los archivos existentes en el directorio de origen.

Todas las funciones realizan un tratamiento de los archivos marcados como sólo lectura.

Las funciones funcionan correctamente sin necesidad de ningún cambio. No obstante, en algunos casos tendréis que modificarlas según vuestras necesidades, y adaptarlas a vuestro sistema de gestión de excepciones. Sois libres de usarlas como base y modificarlas como necesitéis.

Sois libres de usar este código en cualquier aplicación que queráis, tanto Open Source como comercial. Por supuesto, no nos hacemos responsables de cualquier daño o causa de información que el uso de este código pueda generar.

Sois libres de usar este código en cualquier aplicación que queráis, tanto Open Source como comercial. Por supuesto, no nos hacemos responsables de cualquier daño o causa de información que el uso de este código pueda generar.

using System;
//using System.IO;

namespace FileLibrary
{
    class FileLibrary
    {
        /// <summary>
        /// Crea un fichero vacio fichero vacio
        /// </summary>
        public static void CreateEmptyFile(string fullPath)
        {
            if (!System.IO.File.Exists(fullPath))
            {
                using (System.IO.File.Create(fullPath)) { }
            }
        }

        /// <summary>
        /// Crear un directorio vacio
        /// </summary>
        public static void CreateEmptyDirectory(string fullPath)
        {
            if (!System.IO.Directory.Exists(fullPath))
            {
                System.IO.Directory.CreateDirectory(fullPath);
            }
        }

        /// <summary>
        /// Borrar un archivo
        /// </summary>
        public static void DeleteFile(string fullPath)
        {
            if (System.IO.File.Exists(fullPath))
            {
                System.IO.FileInfo info = new System.IO.FileInfo(fullPath);
                info.Attributes = System.IO.FileAttributes.Normal;
                System.IO.File.Delete(fullPath);
            }
        }

        /// <summary>
        /// Borrar un directorio y su contenido
        /// </summary>
        public static void DeleteFolder(string fullPath)
        {
            if (System.IO.Directory.Exists(fullPath))
            {
                System.IO.DirectoryInfo directory = new System.IO.DirectoryInfo(fullPath) {
                    Attributes = System.IO.FileAttributes.Normal
                };

                foreach (var info in directory.GetFileSystemInfos("*", System.IO.SearchOption.AllDirectories))
                {
                    System.IO.FileInfo fInfo = info as System.IO.FileInfo;
                    if (fInfo != null) info.Attributes = System.IO.FileAttributes.Normal;
                }
                System.Threading.Thread.Sleep(100);
                directory.Delete(true);
            }

        }

        /// <summary>
        /// Borra el contenido de un directorio
        /// </summary>
        public static void DeleteFolderContent(string fullPath)
        {
            DeleteFolder(fullPath);
            CreateEmptyDirectory(fullPath);
        }

        /// <summary>
        /// Copiar archivo
        /// </summary>
        public static void CopyFile(string origPath, string destPath, bool overwrite)
        {
            try
            {
                if (System.IO.Path.GetExtension(destPath) == "")
                {
                    destPath = System.IO.Path.Combine(destPath, System.IO.Path.GetFileName(origPath));
                }
                if(!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(destPath)))
                {
                    CreateEmptyDirectory(System.IO.Path.GetDirectoryName(destPath));
                }
                if (!System.IO.File.Exists(destPath))
                {
                    System.IO.File.Copy(origPath, destPath, true);
                }
                else
                {
                    if (overwrite == true)
                    {
                        DeleteFile(destPath);
                        System.IO.File.Copy(origPath, destPath, true);
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        /// <summary>
        /// Copiar el contenido de un directorio
        /// </summary>
        private static void CopyDirectoryContent(string origPath, string destPath, bool overwrite)
        {
            if (System.IO.Directory.Exists(origPath))
            {
                foreach (string dirPath in System.IO.Directory.GetDirectories(origPath, "*", System.IO.SearchOption.AllDirectories))
                {
                    CreateEmptyDirectory(dirPath.Replace(origPath, destPath));
                }

                foreach (string newPath in System.IO.Directory.GetFiles(origPath, "*.*", System.IO.SearchOption.AllDirectories))
                {
                    CopyFile(newPath, newPath.Replace(origPath, destPath), overwrite);
                }
            }
        }
    
    
    /// <summary>
        /// Copiar un directorio y su contenido
        /// </summary>
        public static void CopyDirectory(string origPath, string destPath, bool replace)
        {
            if (replace == true)
            {
                DeleteFolder(destPath);
                CreateEmptyDirectory(destPath);
                CopyDirectoryContent(origPath, destPath, true);
            }
            else
            {
                CopyDirectoryContent(origPath, destPath, true);
            }
        }

    }
}