Ir al contenido principal

Acceder a archivos y carpetas de la aplicacion en c#



Muchas  veces necesitamos acceder a las distintas carpetas que de nuestra aplicación en tiempo de ejecución, ya sea para saber si existe  un archivo, copiarlo, borrarlo, moverlo, listar lo que tiene cierta carpeta o para lo que sea que queramos hacer esto.

Para acceder a las carpetas de la aplicación necesitaremos el espacio de nombres System.IO :

“El espacio de nombres System.IO contiene tipos que permiten leer y escribir en los archivos y secuencias de datos, así como tipos que proporcionan compatibilidad básica con los archivos y directorios.”.

“Utilice la clase Directory para operaciones típicas como copiar, mover, cambiar de nombre, crear y eliminar directorios. También puede utilizar la clase Directory para obtener y establecer información de DateTime relacionada con la creación, el acceso y la escritura de un directorio.”

Dependiendo de nuestra necesidad podremos usar las clases para hacer lo que queramos con las carpetas y archivos dentro de la aplicación, les presentare varios escenarios y les colocare el código necesario para que funcione la solución:
//Obtener los archivos de una ruta:

// Directory.GetFiles(path,filtro)    
 
string[] v = Directory.GetFiles(Server.MapPath("Archivos"), "*.txt");

El metodo GetFiles recibe algunos parametros como son la ruta de la carpeta y/o un filtro para los archivos y deveuelve un Array con la lista de los archivos contenidos en esta carpeta.

Vale aclarar que este método ignora las subcarpetas.

Para establecer la ruta de una carpeta yo suelo utilizar un método llamado Server.MapPath el cual devuelve la ruta relativa o virtual de la carpeta en el servidor.

El filtro es opcional y utiliza Regex, si solo quieres devolver los archivos con extensión txt utilizas “*.txt”.

Si lo que deseas es manipular los archivos entonces el siguiente método te será de ayuda:
private string[] Archivos(string ruta)
    {
        //Obtengo acceso total a la carpeta

        DirectoryInfo picrut = new DirectoryInfo(ruta);
        //Leo y obtengo acceso a los archivos dentro de la carpeta.

        //FileInfo[] se comporta como un array por medio del cual se pueden manipular los archivos (copiar, mover, eliminar, crear, etc)

        FileInfo[] rgFiles = picrut.GetFiles("*.txt");


        //Inicializao un array dandole como tamaño el total de los archivos

        string[] v = new string[rgFiles.Length];


        //Recorro el FileInfo para llenar el array con el nombre de los archivos

        for (int i = 0; i < rgFiles.Length; i++)
        {
            //Aqui puedo manipular los archivos


           // rgFiles[i].Delete(); Para eliminar los archivos
           // rgFiles[i].CopyTo("ruta"); Para copiar el archivo a una ruta especifica
           // rgFiles[i].MoveTo("ruta"); Para mover el archivo a otro lugar
     
            //guardo el nombre de cada archivo en el array
            v[i] = rgFiles[i].Name;
        }

        return v;

    }


Hay muchos métodos mas para manipulación de archivos, pero los iremos viendo mas adelante:

Les dejo un pequeño ejemplo para la descarga aquí.

Espero que lo disfruten y comenten. ;)

"El Conocimiento es un Don Divino que se incrementa a medida que se COMPARTE."

Comentarios

  1. como puedo ver el array de los nombres de los archivos

    ResponderEliminar
  2. Compañero csharpediano,

    El aray lo puedes ver como cualquier otro:
    string s = v[0];

    Ahy tendras el item que se encuentra en la posicion 0 del array, si los quieres ver todos entonces le haces un for al array.

    Cualquier duda me comentas.

    ResponderEliminar
  3. Hola Jairo, tu código me parece excelente, estoy haciendo algo similar a tu código pero no encuentro la sintaxis correcta y talvez me puedes ayudar, tengo un dataset con 2 columnas una contiene el nombre de un archivo y la otra la ruta del archivo, ya tengo el bucle para extraer todas las rutas del dataset en string[], ahora lo que necesito es iterar en este array y comprobar que todos los archivos existen, en caso de que algunos no existan elimine las filas de dichos archivos no existente en el dataset.

    Muchas gracias de antemano

    ResponderEliminar
  4. Hola William,

    Porque no compruebas si el archivo existe cuando estas recorriendo el dataset?
    De esta forma sera mas preciso saber el index del registro que no existe y podrás aplicarle el método Delete(), que lo que hace es: NO BORRA la fila de la tabla dentro del DataSet. Lo que hace es modificar el atributo RowState asociado a la fila poniendole Deleted, pero no la quita del dataset.

    Esto se hace porque el dataset esta asociado a un dataAdapter, que se fija que filas estan marcadas como Deleted, y ejecuta su comando DeleteCommand para borrar la fila del origen de datos (o sea, de la base de datos que corresponda).
    Puedes tambien usar el metodo Remove(), pero del objeto DataRowCollection (que pertenece al objeto DataTable). Este metodo, a diferencia del otro te borra la fila directamente del dataTable, pero el dataAdapter ni se entera, por lo que esa fila, despues no se borrar de tu base de datos.

    Segun lo que quieras hacer fijate que metodo te sirve mas.

    Espero haber sido claro, quedo atento a tu respuesta.

    ResponderEliminar
    Respuestas
    1. Este es el código que hice pero no se cómo terminarlo

      Cargo el dataset con los playlist y sus rutas coreapondientes en el dataset, no estoy usando basé de datos sql, o acces lo estoy trabando con XML

      DsLista.ReadXml("ListaPlaylist.xml");

      Luego hago el declaro un string[] y el bucle que lo rellenará con todas las rutas

      string[] arrfile = new string[DsLista.Tables["Lista"].Rows.Count];

      int f= 0;
      foreach( DataRow fila in DsLista.Tables["Lista"] .Rows)
      {
      arrfile[f] = fila[1].toString();
      f++;
      }
      Hasta aquí todo bien ya ten el array cargado con todas las rutas pero de aquí en adelante no se yo lo improvise así pero sólo me borra el último playlist si es que este no llegara existir, me imagino porque toma el último valor de la variable del bucle

      for(int i=0;i<DsLista.Tables["Lista"].Rows.Count;i++)
      {
      if(!File.Exists(arrfile[i]))
      {
      DataRow xfila = DsLista.Tables["Lista"].Rows[i]; xfila.Delete();
      }
      }
      Analalizalo talvez lo puedes mejorar y darme algunas sugerencia, más que todo es por algo de estiva ya que no quiero llenarle la ventana de msgbox al usuario diciendo que las pistas no existen o que los playlist no existe en caso que a el, aya querido mover las pista o los playlist de su lugar....

      Gracias de antemano Jairo

      Eliminar
  5. Gracias Jairo por responderme,

    Veraz, lo que sucede que la aplicación que estoy haciendo es un reproductor mp3, como no pude realizar el bucle perfectamente, ya había hecho lo primero que me aconsejaste, como lo tengo enlazado con un combo box lo programe en el selectedindex changed y ps funciona y ps también quice hacer esta misma precaución con las pistas pero créeme que se ve feo que se empiezen a desaparecer las pista por parece más bien un fallo del programa, por eso quería hacer el bucle previamente para que sólo aparezcan los archivos existentes de una sola vez...

    ResponderEliminar
    Respuestas
    1. Hola William,

      Intenta haciendo esto.
      Reemplaza el foreach y el for por esto

      foreach( DataRow fila in DsLista.Tables["Lista"] .Rows)
      {
      if (File.Exists(fila[1].toString()))
      {
      arrfile[f] = fila[1].toString();
      f++;
      }
      }

      Y tendrás la información de los archivos que existen en el array.

      Ahora, es necesario que tengas las listas en un xml?

      Yo hice hace un tiempo algo similar, pero lo hice con manejo de archivos.
      Sin necesidad de xml, puedes obtener los archivos de una determinada ruta y ponerlos en un array.

      Si aun sigues teniendo problema dime exactamente que aplicación estas haciendo y como, así podre darte mi perspectiva de como seria la mejor forma de hacerlo.

      Quedo atento.

      Eliminar
    2. sos grande amigo!!!! termine ese bucle con tu ayuda, creeme estoy muy agradecido... ammm voy hacer esta misma comprobacion con las pistas una limpieza de codigo, y donare el codigo a tu blog, para ver si se puede desarrollar mas, por o mejorarlo, he previsto casi todo para que funcione de la mejor manera pero dicen que uno no ve sus propios errores, y como lo he estado trabajando solo mas de alguno ha de tener.... gracias Jairo,

      escribo pronto con el proyecto

      Eliminar
    3. Me alegro mucho que hayas podido encontrar la solución.
      No olvides que cualquier cosa que necesites, aquí siempre estaremos atentos.

      Si lo deseas puedes escribirme al correo jairoortiz19@gmail.com con tu proyecto y lo publicaremos.

      Recuerda siempre: "El conocimiento es un don divino que se incrementa a medida que se comparte."

      Eliminar
    4. tienes toda la razon Jairo, el lunes conparto el proyecto...

      Eliminar
  6. Hola a Jairo quisiera saber si recibisteis el correo que te envíe con domingo del prouecto

    ResponderEliminar
  7. Hola Jairo, acabo de resubir el archivo, esta vez lo subí en zip, dado el caso que el archivo no lleve extensión solo agregale el .zip, lo que sucede es que las ipad ay que hacer muchas tonteras para lograr manipular un archivo....

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Formatos con String.Format en C#

Todas las aplicaciones que desarrollamos en algún momento necesitan formatear algún tipo de datos, y no se a ustedes pero a mi siempre se me olvidan los formatos y como obtener los resultados de una u otra forma, es por eso que decidí hacer este post, y recopilar la mayor cantidad de formatos posibles, para buscarlos cuando necesite y ustedes puedan copiarlos ;=). Para formatear cadenas existe una clase especializada en el manejo de cadenas, esta clase se llama String, su nombre completo es System.String, ya que se encuentra en el namespace System. En esta clase vamos a encontrar una función llamada Format que se encargará de reemplazar el valor de un dato (entero, real, una cadena, un carácter, hasta de un objeto), por el formato que se especifique en el parámetro. En forma general, y aunque tiene varias sobrecargas, String.Format tiene la siguiente sintaxis: Formatos para números:   Tipo ...

Guía completa de .NET MAUI para el desarrollo de aplicaciones móviles multiplataforma

Guía completa de .NET MAUI para el desarrollo de aplicaciones móviles multiplataforma ⏱️ Tiempo de lectura: 30 minutos 🎯 Nivel: Intermedio ¡Prepárate para revolucionar el desarrollo móvil! Descubre .NET MAUI, el marco multiplataforma que te permite crear aplicaciones nativas para iOS, Android y escritorio con una sola base de código. Adéntrate en los fundamentos, implementaciones prácticas, ejemplos avanzados y mejores prácticas para dominar .NET MAUI y llevar tus habilidades de desarrollo móvil al siguiente nivel. 📑 Contenido del Artículo Introducción a .NET MAUI para móviles Fundamentos y Conceptos Clave Arquitectura de .NET MAUI ...

Hora Militar o Formato 24 Horas en SQL SERVER

Es curioso los problemas que nos encontramos a diario al desarrollar, siempre resulta que hay algo nuevo y algo que no sabemos, aprendemos día a día con cada cosa que hacemos, y cada código que escribimos. El día de hoy les traigo una instrucción que si bien es muy sencilla, puede ahorrarnos varias horas de búsqueda infructuosa en san google. Se trata de convertir una hora en sql server al formato militar o formato de 24 horas. Para esto tenemos varias formas: SELECT CONVERT(VARCHAR(8), dateadd(HOUR,12, cast('2017-01-01 10:15:00' as datetime)), 108) AS HoraMilitar Veamos lo que se hace en la instrucción anterior: Tenemos la fecha y hora: 2017-01-01 10:15:00 la cual convertimos a datetime cast('2017-01-01 10:15:00' as datetime) luego le sumamos 12 horas para ejemplificar el ejercicio "dateadd(HOUR,12," y por ultimo pasamos a varchar para darle formato militar CONVERT(VARCHAR(8), "Aquí la fecha",108) Notese que uso el código 108 de con...