Aquí les paso un ejemplo de una función recursiva en C++ que busca un archivo en una carpeta y todas sus subcarpetas.
Hice dos versiones, una para Windows y otra para GNU/Linux.
La versión para Windows la compilé con el Visual C++ .NET 2003 y el Dev C++ 4.9.9.2 bajo Windows XP pro SP2, y la de GNU/Linux con el g++ 4.1.2 bajo Ubuntu 6.0.
Probé ambos programas y aparentemente si encuentra las carpetas en donde se encuentra el archivo a buscar. Si lo prueban y encuentran errores les agradecería me los comentaran para corregirlos.
Versión Windows
Versión GNU/Linux
Hice dos versiones, una para Windows y otra para GNU/Linux.
La versión para Windows la compilé con el Visual C++ .NET 2003 y el Dev C++ 4.9.9.2 bajo Windows XP pro SP2, y la de GNU/Linux con el g++ 4.1.2 bajo Ubuntu 6.0.
Probé ambos programas y aparentemente si encuentra las carpetas en donde se encuentra el archivo a buscar. Si lo prueban y encuentran errores les agradecería me los comentaran para corregirlos.
Versión Windows
Código [Seleccionar]
#include <iostream>
#include <vector>
#include <string>
using namespace std;
#include <direct.h>
#include <io.h>
void FindFile (const string& archivo, const string& carpeta)
{
static struct _finddata_t c_file;
static long hFile;
static string filespec;
filespec = carpeta + "\\*.*";
if ((hFile = _findfirst (filespec.c_str(), &c_file )) == -1L )
return;
vector<string> carpetas;
do {
if ((c_file.attrib & _A_ARCH) != 0) { // no es un subdirectorio
if (c_file.name == archivo)
cout << '[' << carpeta << ']' << endl;
} else if ((c_file.attrib & _A_ARCH) == 0 && strcmp (c_file.name, ".") && strcmp (c_file.name, ".."))
carpetas.push_back (c_file.name);
} while (_findnext( hFile, &c_file ) == 0);
_findclose( hFile );
for (int i = 0; i < carpetas.size (); ++i)
FindFile (archivo, carpeta + "\\" + carpetas[i]);
}
int main(int argc, char* argv[])
{
FindFile ("TimerSessionClient.java", "C:\\temp");
return 0;
}
Versión GNU/Linux
Código [Seleccionar]
#include <iostream>
#include <vector>
#include <string>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
using namespace std;
void FindFile (const string& archivo, const string& carpeta)
{
static DIR *dir;
static struct dirent *mi_dirent;
if( (dir = opendir (carpeta.c_str())) == NULL )
return;
vector<string> carpetas;
while ((mi_dirent = readdir (dir)) != NULL) {
if (string (mi_dirent->d_name) == "." || string (mi_dirent->d_name) == "..")
continue;
string cadina = carpeta + '/' + mi_dirent->d_name;
struct stat structura;
if (stat (cadina.c_str(), &structura) < 0)
;//cout << "error en stat" << endl;
else if (S_ISDIR (structura.st_mode))
carpetas.push_back (mi_dirent->d_name);
else if (archivo == mi_dirent->d_name)
cout << '[' << cadina << ']' << endl;
}
closedir (dir);
for (int i = 0; i < carpetas.size(); ++i)
FindFile (archivo, carpeta + '/' + carpetas[i]);
}
int main ( int argc, char *argv[] )
{
FindFile ("sony-sleep", "/etc");
return 0;
}