C/Visual C - Buscador

 
Vista:

Buscador

Publicado por Alexandro (1 intervención) el 06/06/2006 05:36:47
Salu2s
Me podria alguien ayudar en la creacion de un buscador de EXEs,pues he logrado
algo pero esto solo me busca dentro del lugar donde lo ejecute:

fexe=FindFirstFile("*.exe",&FindFileData);
while(FindNextFile(fexe,&FindFileData)!=0){
cout<<FindFileData.cFileName<<"\n";
}

La idea es que quisiera que me buscara por toda la pc como hace el buscador de
Windows entienden,de cierta forma es como entrar en todas las carpetas de la pc y salir si no esta lo que busco y seguir,algo recursivo creo .Pero no doy con como implementarlo.Les agradeceria mucho su ayuda.

Ojala y pueda alguien ayudarme
Alexandro
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Buscador

Publicado por fernando.gomez (1603 intervenciones) el 06/06/2006 06:23:26
Ibas bastante bien, a tu código sólo le falta la recursión. Sirva este codiguillo a guisa de guía. No probé el código, pero debe funcionar (en el peor de los casos, con cambios mínimos).

Lo que hace el código es en escencia lo que tú estabas haciendo: recorrer el directorio actual -que en main, comienza con C:\. Busco TODO, y si el archivo encontrado es un directorio (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY == FILE_ATTRIBUTE_DIRECTORY) entonces aplico recursión y vuelvo a llamar a la función FindAllFiles. Si no es un archivo, busco que tenga la extensión .exe. Si sí, la guardo en el vector.

En main sólo mando llamar a la función comenzando en C:\, y en cuanto me encuentre algún directorio, la recursión se encargará de obtener todos los archivos del subdirectorio, guardándolos en el vector.

typedef std::vector<std::string> StringVtr;

void FindAllFiles(StringVtr& vtrFiles, string strFindAt)
{
WIN32_FIND_DATA findData;
HANDLE hFind;
BOOL bFileFound = TRUE;

strFindAt += "\\*.*";

for (hFind = FindFirstFile(strFindAt.c_str(), &findData);
bFileFound;
bFileFound = FindNextFile(hFind, &findData))
{
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
== FILE_ATTRIBUTE_DIRECTORY)
{ // es un directorio, usamos recursión
FindAllFiles(vtrFiles, findData.cFileName);
}
else
{ // agregamos el nombre del archivo al vector
if (strstr(findData.cFileName, ".exe") != NULL) {
vtrFiles.push_back(string(findData.cFileName));
}
}
}
CloseHandle(hFind);
}

int main()
{
StringVtr vtrFiles;
StringVtr::iterator iterFiles;

FindAllFiles(vtrFiles, "C:");
for (iterFiles = vtrFiles.begin();
iterFiles != vtrFiles.end();
++iterFiles)
{
cout << "Archivo : " << iterFiles->c_str() << endl;
}
}

Nota: si trabajas con MFC, quizás te convenga emplear CArray y CString en lugar de std::vector y std::string.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Buscador

Publicado por fernando.gomez (1603 intervenciones) el 06/06/2006 06:26:54
Perdón, corrigo la función main, me faltó el return.

int main()
{
StringVtr vtrFiles;
StringVtr::iterator iterFiles;

FindAllFiles(vtrFiles, "C:");
for (iterFiles = vtrFiles.begin();
iterFiles != vtrFiles.end();
++iterFiles)
{
cout << "Archivo : " << iterFiles->c_str() << endl;
}
return EXIT_SUCCESS;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar