Nº archivos en un directorio (lenguaje c)

Bueno pues por más que busco e investigo, no consigo hallar como hacerlo.

Lo que busco es poder enumerar todos los archivos de un directorio con cierta extensión, y a su vez, guardar el nombre del archivo en un array.

Por ejemplo, a modo esquema (extensión cualquiera):

data/entra/modo1.eol
data/entra/modo2.eol
data/file1.eol
data/file2.eol

Que indique que hay 4 archivos en el directorio "data" y se guarde su nombre en un array, pero lo importante es que indique el número de archivos.

¿Tenéis alguna idea?
Con las funciones de la cabecera dirent.h lo tienes servido. Echale un vistazo y cualquier cosa que necesites, por aqui andamos :)
iceman755 escribió:Con las funciones de la cabecera dirent.h lo tienes servido. Echale un vistazo y cualquier cosa que necesites, por aqui andamos :)
Ya lo he ojeado y no tengo ni idea ^^'', a ver si puedes comentarme algo, de todas formas, indagaré más.
ummmm ok XD

incluyes la cabecera
#include <dirent.h>


luego, donde necesites recorrer el directorio, declaras dos variables, de la siguiente manera
DIR *directorio;
struct dirent *fichero;


ahora abres el directorio
directorio = opendir("aqui ruta del directorio que quieres abrir");


verificas si abrio o no
if(directorio == NULL)
{
       //si entra aqui, no abrio, lo manejas a tu antojo

}


recorres el directorio
while(fichero = readdir(directorio))
{
     //aqui haces lo que quieras con el fichero encontrado
     //en fichero->d_name tienes el nombre del fichero
     //cada iteracion de este bloque es por cada entrada en el directorio, sean directorios o ficheros
}


cuando termines, cierras el directorio
closedir(directorio);


Con eso tienes para entretenerte xDDD tienes que verificar la extension de los ficheros de acuerdo al nombre que tienen, asi decides si los usas o los rechazas.
Gracias.

Esa parte mas menos si la tenía, lo que me falta es ver las extensiones y tal, habrá que probar ^^

Saludos.
En fichero->d_name tienes el nombre completo incluida la extension, solo tienes que crear una funcion que reciba ese nombre y la extension contra la cual quieres comparar; dentro de dicha funcion comparas la extension con los ultimos n caracteres (de acuerto a la extension). Algo mas para entretenerte xDDD si necesitas ayuda para construir dicha funcion, pues por aqui seguimos andando :D

Saludos!!!
fichero->d_name se considera como un char? o deberia pasarlo a uno?
Es un array de char. lo puedes usar tal cual, o sea, no tienes que pasarlo.
Para ver si tiene extension he mirado un poco en c.conclase y he hecho una funcion usando strncmp() y strrchr().

Ahora vamos a los directorios :-|

PD: no consigo almacenar el nombre de ninguna manera. Ni usando sprintf ni strncpy ni nada :|, sin embargo, tengo también una variable dentro que me indica el numero de archivos que hay con dicha extensión, y si suma, así que nose :(
Pega el codigo, para echarle un ojo.
Es usando NFlib (Nintendo DS).

void Dir_struct(const char* carpeta){
     DIR *directorio;
     struct dirent *infodir;
     u8 valido = 0;
     u16 var = 0;
     char buffer[32];
     
     //Abrimos la carpeta
     directorio = opendir(carpeta);
     
     if(directorio == NULL)
     {
                   NF_WriteText(0,0,7,21,"ERROR");
                   for(;;){
                           swiWaitForVBlank();
                           }
     }
     
     while((infodir = readdir(directorio)) != NULL )
     {
                   valido = C_extension(infodir->d_name);
                   if(valido == 1){
                             /*No fufa ninguna
                             sprintf(buffer,"%s",(char*)(infodir->d_name));
                             strncpy(buffer, infodir->d_name, 10);
                             */
                             NF_WriteTextVAR(0,0,1,8,"%s",buffer);
                             var++;
                             }
             
     }
     
     NF_WriteTextVAR(0,0,1,6,"Roms->dir: %d",var);
     NF_WriteTextVAR(0,0,1,7,"Rom: %s",buffer);
     NF_UpdateTextLayers(); //Actualiza la pantalla
     
     closedir(directorio);
}


Var si muestra 1 (en la carpeta hay 1 archivo) pero no el nombre no :/

Saludos y grax!
El codigo esta bien, con sustituir las funciones propias de NFL tu funcion trabaja perfecto, con sprintf o strncpy tira bien.

Lo unico que se me ocurre es que quizas NF_WriteTextVAR no rule como debe.
Me he dado cuenta que la función que he hecho para ver la extensión no funciona bien, no toma por igual .xx que .XX

Y el problema de esto, es que al parecer, no funciona ninguna función, ni la de mostrar texto ni nunguna, solo funciona sumar la variable, es raro raro raro.

PD: Solved (alguna mejora que añadir?)

//Funcion comprobar si es un .nds o no
int C_extension(const char* nombre){
     //Declaramos variables
     u8 valido = 0;
     u8 longitud = 0;
     u8 i = 0, j = 0;
     char * extension;
     
     //Obtenemos la longitud del array
     longitud = strlen(nombre);
     
     //Obtenemos la extension que tiene
     for(i = (longitud-4); i < longitud; i++){
           extension[j] = nombre[i];
           j++;
           }
     
     //Comprobamos
     if((strcmp(extension,".nds") == 0) || (strcmp(extension,".NDS") == 0))
     {
                                   valido = 1;
     }else{
                                   valido = 0;
     }

     return valido;
}

//Para trimmear la SD completa sirve esta misma funcion solo que como "carpeta" usamos ("."), como en chdir(".");
void Dir_struct(const char* carpeta){
     DIR *directorio;
     struct dirent *infodir;
     u8 valido = 0;
     u16 rom = 0;
     u16 carp = 0;
     u8 i=0;
     
     //Abrimos la carpeta
     directorio = opendir(carpeta);
     
     if(directorio == NULL)
     {
                   NF_WriteText(0,0,7,21,"ERROR");
                   for(;;){
                           swiWaitForVBlank();
                           }
     }
     
     while((infodir = readdir(directorio)) != NULL )
     {                               
                   valido = C_extension(infodir->d_name);
                   switch(valido){
                                 case 0:
                                      if((strcmp(infodir->d_name,".") != 0) && (strcmp(infodir->d_name,"..") != 0)){
                                      carp++;
                                      }
                                      break;
                                 case 1:
                                      strcpy(buffer, infodir->d_name);
                                      rom++;
                                      break;
                   }
                   i++;
             
     }
     
     //Debug
     NF_WriteTextVAR(0,0,1,21,"Nº Roms     : %d",rom);
     NF_WriteTextVAR(0,0,1,22,"Nº Carpetas : %d",carp);
     NF_UpdateTextLayers();
}
12 respuestas