[C con Clase] Recorrer una carpeta
Steven Davidson
steven en conclase.net
Sab Jun 2 03:47:32 CEST 2007
Hola Carlos,
El pasado 2007-06-01 23:53:17, Carlos escribió:
C> Hola. Estoy realizando una tarea para un curso de c++ y me pusieron a
C> hacer un programa que encriptara y desencriptara. Ya casi lo tengo
C> listo lo único que me falta es que dada la dirección de una carpeta
C> encripte o desencripte cada archivo que esta contenida en ella. Ya
C> busque por internet y lo que me aparece son soluciones con dir.h
C> (findfirst, findnext) pero en mi visual c++ no esta y una que baje de
C> internet no tengo ni idea como usarla.
Manejar directorios (o carpetas) y subdirectorios realmente depende del sistema de ficheros que tu plataforma implemente. Por esta razón, las bibliotecas estándares de ANSI C/C++ no ofrece tal funcionalidad. Por consiguiente, tendrás que hacer uso de bibliotecas no estándares.
Como indicas que usas VC++, te daré la solución para este compilador. Las funciones y ficheros de cabecera que indicas existen para MS-DOS. Como este sistema operativo es obsoleto, tendrás que pasarte a MS-Windows. Sin embargo, VC++ aún implementa algunas funciones sencillas o que tengan equivalencia con las de MS-Windows. Las funciones existentes bajo VC++ son las mismas que indicas pero los nombres tienen un subrayado como prefijo; supuestamente para indicar que no son funciones estándares. Por lo tanto, las funciones que te interesan son '_findfirst()', '_findnext()', y '_findclose()', las cuales se declaran en <io.h>. Te pongo un ejemplo,
_finddata_t fdInfo;
intptr_t nID;
// Buscar todas las DLL's
nID = _findfirst( "C:\\winnt\\system32\\*.dll", &fdInfo );
if( -1 == nID )
{
// Error
...
}
else
{
cout << "Lista de ficheros \".dll\" en \"C:\\\\winnt\\system32\\\":\n";
do
cout << fdInfo.name << "\t[" << fdInfo.size << " bytes]\n";
while( !_findnext( nID, &fdInfo ) );
_findclose( nID );
}
La estructura '_finddata_t' contiene los siguientes campos:
unsigned attrib
Atributos del fichero.
time_t time_create
Fecha y hora de la creación del fichero (–1L para sistemas FAT).
time_t time_access
Fecha y hora del último acceso al fichero (–1L para sistemas FAT).
time_t time_write
Fecha y hora de la última escritura al fichero.
_fsize_t size
Tamaño del fichero en bytes.
char name[_MAX_FNAME]
Nombre (terminado en cero) del fichero o directorio encontrado, sin la ruta.
#define _MAX_FNAME 256
Para el campo 'attrib', tenemos las siguientes constantes definidas:
_A_ARCH
Archivo. Establecido cuando el fichero es modificado, y despejado por el
comando BACKUP. Value: 0x20.
_A_HIDDEN
Fichero escondido. Normalmente no es visto con el comando DIR, al menos que se
especifique la opción /AH. Regresa información acerca de ficheros normales al
igual que ficheros con este atributo. Value: 0x02.
_A_NORMAL
Normal. El fichero puede ser leído o escrito sin restricción. Value: 0x00.
_A_RDONLY
Sólo-Lectura. El fichero no puedes ser abierto para escritura, y un fichero
con el mismo nombre no puede ser creado. Value: 0x01.
_A_SUBDIR
Subdirectorio. Value: 0x10.
_A_SYSTEM
Fichero del sistema. Normalmente no es visto con el comando DIR, al menos que
se especifiquen las opciones /A o /A:S. Value: 0x04.
Espero que todo esto te ayude.
Steven
Más información sobre la lista de distribución Cconclase