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."

12 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

Google