Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Devolver cantidad de archivos .* en directorio

Estas en el tema de Devolver cantidad de archivos .* en directorio en el foro de C/C++ en Foros del Web. Hola, tengo un servidor que recibe funciones y una de las cuales es contar cuantos archivos hay en el directorio que trabaja que cumplan un ...
  #1 (permalink)  
Antiguo 13/12/2016, 10:06
 
Fecha de Ingreso: julio-2015
Ubicación: Barcelona
Mensajes: 91
Antigüedad: 1 año, 6 meses
Puntos: 3
Pregunta Devolver cantidad de archivos .* en directorio

Hola,

tengo un servidor que recibe funciones y una de las cuales es contar cuantos archivos hay en el directorio que trabaja que cumplan un "pattern".

Digamos que en mi directorio hay 3 archivos .txt.

Si yo llamo a la función: do_numfiles txt.
El output tiene que ser 3.

Código C:
Ver original
  1. do_numfiles (char *pattern)
  2. {
  3.   t_string s;
  4.  
  5.  
  6.   sprintf (s, "%s[%d] numfiles %s (not yet implemented)\n%s", color_red,
  7.            getpid (), pattern, color_end);
  8.   if (write (1, s, strlen (s)) == -1)
  9.     return -1;
  10.  
  11.   delay ();
  12.  
  13.   /* Must return the number of file names that satisfy the pattern */
  14.   return 0;
  15. }

No puedo usar SYSTEM, que otra manera tengo de que en el directorio en el que trabaja, cuente cuantos archivos hay con ese pattern y me lo devuelva?

Gracias.
  #2 (permalink)  
Antiguo 14/12/2016, 04:00
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 2 años, 4 meses
Puntos: 204
Respuesta: Devolver cantidad de archivos .* en directorio

No especificas el lenguaje (C/C++) por lo que te daré una respuesta genérica.

Tanto C como C++ carecen de un mecanismo estándar para interactuar con el árbol de directorios. Tienes, por tanto, dos posibilidades:
  • Buscar una librería de terceros que sea multiplataforma y te proporcione la funcionalidad buscada
  • Utilizar directamente las utilidades que te proporciona la API del sistema operativo. (Esta opción no será portable entre Linux/Windows por ejemplo)
En el caso de soluciones multiplataforma en C++ puedes optar por usar boost filesystem module
Otra opción es usar tinydir, que imagino que funcionará tanto en C como en C++.

Si tu opción pasa por hablar directamente con el sistema operativo, en el caso de Linux puedes usar la librería dirent:

Código C:
Ver original
  1. DIR* dirp = opendir(".");
  2. struct dirent *dp;
  3. readdir(tableDir); // ignorar '.'
  4. readdir(tableDir); // ignorar '..'
  5.  
  6. while ((dp = readdir(dirp)) != NULL)
  7.   printf("%s\n",dp->d_name);
  8. closedir(dirp);

En el caso de Windows te toca buscar la documentación en la msdn. No tengo tiempo ahora mismo de investigarlo por mi cuenta.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 14/12/2016, 09:05
 
Fecha de Ingreso: febrero-2015
Ubicación: France
Mensajes: 12
Antigüedad: 2 años
Puntos: 1
Respuesta: Devolver cantidad de archivos .* en directorio

Hola,

Si te gusta usar DIR* con Windows es posible : dirent.h existe, pero hay algunas diferencias : readdir() se vuelve opendir() y no necessitas incluir <sys/types.h>

Por ejemplo :

Código C++:
Ver original
  1. #include <stdlib.h>
  2. #include <dirent.h>
  3. #ifndef WIN32 /* si no Windows */
  4.     #include <sys/types.h>  /* pues incluir sys/types.h */
  5. #endif
  6.  
  7. int main(int argc, char **argv)
  8. {
  9.     DIR* dir = 0;
  10.     dir = opendir("...");
  11.     if (!dir)
  12.     {
  13.         exit(1);
  14.     }
  15.  
  16.     if (closedir(rep) == -1)
  17.    {
  18.        exit(-1);
  19.    }
  20.   return 0;
  21. }


Un saludo.
  #4 (permalink)  
Antiguo 14/12/2016, 16:35
 
Fecha de Ingreso: febrero-2015
Mensajes: 387
Antigüedad: 2 años
Puntos: 2
Respuesta: Devolver cantidad de archivos .* en directorio

dir.h y io.h también te pueden servir y creo que usando dos.h también puedes.



La zona horaria es GMT -6. Ahora son las 08:42.