Programación General > C++ Builder

 Realizar búsqueda de texto en carpeta de archivos .txt

(1/1)

Akemati:
Hola,

Estoy realizando una aplicación en la que quisiera incluir un sencillo motor de búsqueda que permita, al introducir texto o palabras clave en un TEdit por ejemplo, recuperar la ubicación del archivo de texto .txt que más coincida con mi búsqueda (para posteriormenete utilizarlo), dicho archivo estará ubicado en alguna carpeta que reagrupa varios ficheros .txt almacenados previamente.

 Mucho les agradezco su ayuda!

softevolutions:
Tienes un componente llamado TFileListBox. Hechale un vistazo a ve si te sirve.

Ahí tienes todos los ficheros de una ubicación concreta.

Akemati:
Hola,

Muchas gracias por tu sugerencia, aunque lo que necesito parece un poco más complicado, dado que soy principiante estoy tratando de solucionar mi problema con lo que encuentro en la red. Por allí encontre un componente ActiveX, realizado por el desarrollador SoftInterface, llamado FindInFilesX (no pude poner URL pero se encuentra facilmente en Google) que propone un buscador para insertar en cualquier aplicación y realizar este tipo de consultas, es gratuito y provee además el código pero en VB, viene en el manual un ejemplo sencillo pero no pude aplicarlo pues desconozco este lenguaje. Sería de mucha ayuda si alguien pudiera revisarlo y postear por aquí el código para C++ Builder!

Muchas gracias!

Akemati:
Estoy tratando de convertir el código para utilizar el TFileinFilesX como componente C++ Builder pero me marca error en los parámetros de GetFileData, alguién podría ayudarme a traducir el siguiente código para el Builder C++, está escrito en VB:


--- Código: Visual Basic ---Private Sub FiFx1_ScanCompleted()Dim ii As LongDim sData As StringDim sFileName As StringDim lLine As Long, lColumn As Long, sFound As StringcmdAbort.Visible = FalselstData.Clear ' Clear List box' Add data from the FindInFilesX control on the main formFor ii = 0 To FifX1.SearchCount - 1If (FifX1.GetFileData(ii, sFileName, lLine, lColumn,sFound) = True) ThensData = sFileName & " --- " & _CStr(lLine) & " --- " & _CStr(lColumn) & " --- " & _CStr(sFound)Call lstData.AddItem(sData)End IfNext iiCaption = CStr(lstData.ListCount) & " items found from FifX1"End Sub  

Akemati:
Hola,

Un amigo pudo ayudarme a resolver mi problema y por aquí voy a postear el código por si a alguien le es de utilidad.

Se necesita un TEdit para escribir una palabra a buscar, un TButton para lanzar la búsqueda y las coincidencias junto con la ruta del archivo(s) encontrado(s) se despliegan en un TListBox.

Esto en el header:


--- Código: C++ ---#include<stdio.h>#include<stdlib.h>#include<string>#include<windows.h> 
Después poner el siguiente código en el evento Onclick del Botón:


--- Código: C++ ---AnsiString Texto;    AnsiString Texto2;    char Pbuscar[255];    char linea[255];    char *coincidenciast[255];    char frase[255];    int contador;    int longitud;                char c;    FILE *archivo;    WIN32_FIND_DATA findFileData;                HANDLE hFind;    char dirtmp[255];    char exttmp[255];    char dir[255];    char filename[255];    char ruta[255];    std::string str;    Texto = Edit1->Text; //Recuperar el texto desde el TEdit    strcpy(Pbuscar,Texto.c_str());    strcpy(dirtmp, "c:\MiCarpeta\"); //Aquí el directorio conteniendo los archivos a buscar    strcpy(dir, dirtmp);    strcat(dir,"\");    strcat(dirtmp,"*.txt"); //Esta es la extensión de archivos en dónde realiza la búsqueda    hFind = FindFirstFile(dirtmp, &findFileData);    if(hFind == INVALID_HANDLE_VALUE)                   {                           printf("Directorio no existe o es incorrecto");                    }     else    {          strcpy(ruta,"");          str = (std::string)findFileData.cFileName;    longitud = str.length();       if(longitud >12)           {             str = (std::string)findFileData.cAlternateFileName;    }  for(int i=0; i < longitud;i++)  {          filename[i] = str[i];  }  filename[longitud] = '';  strcpy(ruta, dir);  strncat(ruta, filename, strlen(filename));  contador = 0;  if((archivo = fopen(ruta,"r")) != NULL)  {   while ((fscanf(archivo, "%s%c", linea, &c)) != EOF)   {     if(strcmp(linea, Pbuscar) == 0 && *linea != '')     {     contador++;     }   }   if(contador>0)   {          }   fclose(archivo);  }  else  {    printf("Error al abrir archivo - %s n", ruta);     getchar();  }  fflush(stdin);  }  while(FindNextFile(hFind, &findFileData) != 0) {   strcpy(ruta,"");   contador = 0;   str = (std::string)findFileData.cFileName;    longitud = str.length();    if(longitud>12)   {       str = (std::string)findFileData.cAlternateFileName;   }   for(int i=0; i < longitud;i++)  {          filename[i] = str[i];  }  filename[longitud] = '';  strcpy(ruta, dir);  strncat(ruta, filename, strlen(filename));  if((archivo = fopen(ruta,"r")) != NULL)  {   while ((fscanf(archivo, "%s%c", linea, &c)) != EOF)   {      if(strcmp(linea,Pbuscar) == 0 && *linea != '')     {         contador++;     }   }    if(contador>0)    {    strcpy(frase, " coincidencias en ");            itoa(contador, *coincidenciast, 10);            strncat(*coincidenciast, frase, strlen(frase));            strncat(*coincidenciast, ruta, strlen(ruta));            lstData->Items->Add(*coincidenciast); //Enviar búsqueda a TListBox             }   fclose(archivo);  }  else  {    printf("Error al abrir archivo - %s n", ruta);     getchar();    //exit(1);  }  fflush(stdin);}  
Una disculpa ya que el código no está ni bien comentado ni optimizado pero a mi me ayudó en mi problema.

Navegación

[0] Índice de Mensajes

Ir a la versión completa