Como funciona findfirst
haber si puede ayudarme alguien con la función findfirst() del c++Builder, porque hay algun parametro que no se para que sirve.
¿Se puede recorrer subdirectorios con esta funcion?
¿Se puede recorrer subdirectorios con esta funcion?
Bueno, yo esta función la he utilizado en el C y el C++ no se si en el C++ Builder funcionara asà pero igual te sirve de ayuda.
En principio esta función tiene tres parametros
findfirst (char *, struct ffblk *, int)
1. El primero es un char * en el cual irá la dirección de memoria donde se guarda el string del fichero o directorio que quieres buscar.
2. El segundo parámetro es la dirección de una estructura que en el C y el C++ ya esta definida por defecto, que es la ffblk (te la explico más abajo). El parametro es de salida.
3. El tercer parámetro es un entero y te permitirá decidir si lo que quieres buscar es un fichero, un directorio, un fichero oculto, etc.
La estructura ffblk tiene lo siguiente.
struct ffblk {
char ff_reseved[2]
char ff_attrib // atributo del archivo.
int ff_ftime // hora de creación
int ff_date // fecha de creación
long ff_fsize // tamaño del fichero en bytes
char ff_name[13] //nombre del fichero
}
Como te he dicho anteriormente este parámetro es de salida por lo que no tendrás que infornar nada de esta estructura cuando hagas la llamada. Te servirá una vez hayas hecho la llamada al findfirst para saber el nombre del fichero que has encontrado, para seguir buscando con el findnext, etc.
El atributo. El atributo de un fichero en realidad se define con un byte (un char para ser más claro de la siguente forma):
Bit 0 -> Activado si quieres tratar los ficheros que son solo de lectura.
Bit 1 -> Activado si quieres tratar los ficheros que están ocultos.
Bit 2 -> Activado si quieres tratar los ficheros del sistema.
Bit 3 -> Activado para la etiqueta de volumen (solo puede existir en el directorio raiz)
Bit 4 -> Activado si quieres tratar los directorios.
Bit 5 -> Indica que se ha modificado este fichero (no tiene mucho sentido para la llamada)
Bit 6 y 7 -> Estan reservados.
Por ejemplo imaginate que quieres tratar los directorios entonces solo activarias el Bit 4 lo que te quedaria: 00010000 este número pasado a decimal es el 16 entonces este campo tendrÃas que poner un 16.
Imaginate que ahora quieres tratar los ficheros ocultos y del sistema te quedarÃa: 00000110 que en decimal es el 6, pues tienes que añadir un 6.
Nota importante: En cualquier caso siempre tratará los ficheros normales (es decir que ni son únicamente de lectura, ni estan ocultos ni son del sistema).
Para finalizar te pongo un ejemplo:
Imaginate que del directorio C:prueba quieres coger solo los ficheros "normales" que tengan la extension c.
El programa harÃa algo asÃ:
char path[30];
struct ffblk est_fic;
int atrib
strcpy(path,"C:PRUEBA*.C"); // el path y los archivos que quiero buscar
atrib = 0; // Como solo quiero los ficheros normales no activo ningún bit de los anteriores por lo tanto es cero.
findfirst(path,est_fic,atrib); // Buscamos en el directorio el primer fichero.
Si quiero seguir buscando el siguiente fichero harÃa findnext(est_fic); pero cuidado el est_fic debe tener ahora lo mismo que tenÃa después de la llamada del findfirst.
Espero que te sirva de ayuda
Adios ;-)
En principio esta función tiene tres parametros
findfirst (char *, struct ffblk *, int)
1. El primero es un char * en el cual irá la dirección de memoria donde se guarda el string del fichero o directorio que quieres buscar.
2. El segundo parámetro es la dirección de una estructura que en el C y el C++ ya esta definida por defecto, que es la ffblk (te la explico más abajo). El parametro es de salida.
3. El tercer parámetro es un entero y te permitirá decidir si lo que quieres buscar es un fichero, un directorio, un fichero oculto, etc.
La estructura ffblk tiene lo siguiente.
struct ffblk {
char ff_reseved[2]
char ff_attrib // atributo del archivo.
int ff_ftime // hora de creación
int ff_date // fecha de creación
long ff_fsize // tamaño del fichero en bytes
char ff_name[13] //nombre del fichero
}
Como te he dicho anteriormente este parámetro es de salida por lo que no tendrás que infornar nada de esta estructura cuando hagas la llamada. Te servirá una vez hayas hecho la llamada al findfirst para saber el nombre del fichero que has encontrado, para seguir buscando con el findnext, etc.
El atributo. El atributo de un fichero en realidad se define con un byte (un char para ser más claro de la siguente forma):
Bit 0 -> Activado si quieres tratar los ficheros que son solo de lectura.
Bit 1 -> Activado si quieres tratar los ficheros que están ocultos.
Bit 2 -> Activado si quieres tratar los ficheros del sistema.
Bit 3 -> Activado para la etiqueta de volumen (solo puede existir en el directorio raiz)
Bit 4 -> Activado si quieres tratar los directorios.
Bit 5 -> Indica que se ha modificado este fichero (no tiene mucho sentido para la llamada)
Bit 6 y 7 -> Estan reservados.
Por ejemplo imaginate que quieres tratar los directorios entonces solo activarias el Bit 4 lo que te quedaria: 00010000 este número pasado a decimal es el 16 entonces este campo tendrÃas que poner un 16.
Imaginate que ahora quieres tratar los ficheros ocultos y del sistema te quedarÃa: 00000110 que en decimal es el 6, pues tienes que añadir un 6.
Nota importante: En cualquier caso siempre tratará los ficheros normales (es decir que ni son únicamente de lectura, ni estan ocultos ni son del sistema).
Para finalizar te pongo un ejemplo:
Imaginate que del directorio C:prueba quieres coger solo los ficheros "normales" que tengan la extension c.
El programa harÃa algo asÃ:
char path[30];
struct ffblk est_fic;
int atrib
strcpy(path,"C:PRUEBA*.C"); // el path y los archivos que quiero buscar
atrib = 0; // Como solo quiero los ficheros normales no activo ningún bit de los anteriores por lo tanto es cero.
findfirst(path,est_fic,atrib); // Buscamos en el directorio el primer fichero.
Si quiero seguir buscando el siguiente fichero harÃa findnext(est_fic); pero cuidado el est_fic debe tener ahora lo mismo que tenÃa después de la llamada del findfirst.
Espero que te sirva de ayuda
Adios ;-)
