[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