SoloCodigo

Programación General => C/C++ => C++ Builder => Mensaje iniciado por: Akemati en Miércoles 10 de Noviembre de 2010, 14:35

Título: Realizar búsqueda de texto en carpeta de archivos .txt
Publicado por: Akemati en Miércoles 10 de Noviembre de 2010, 14:35
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!
Título: Re: Realizar búsqueda de texto en carpeta de archivos .txt
Publicado por: softevolutions en Miércoles 10 de Noviembre de 2010, 19:09
Tienes un componente llamado TFileListBox. Hechale un vistazo a ve si te sirve.

Ahí tienes todos los ficheros de una ubicación concreta.
Título: Re: Realizar búsqueda de texto en carpeta de archivos .txt
Publicado por: Akemati en Lunes 15 de Noviembre de 2010, 14:08
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!
Título: Re: Realizar búsqueda de texto en carpeta de archivos .txt
Publicado por: Akemati en Jueves 18 de Noviembre de 2010, 11:38
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
  1. Private Sub FiFx1_ScanCompleted()
  2. Dim ii As Long
  3. Dim sData As String
  4. Dim sFileName As String
  5. Dim lLine As Long, lColumn As Long, sFound As String
  6. cmdAbort.Visible = False
  7. lstData.Clear ' Clear List box
  8. ' Add data from the FindInFilesX control on the main form
  9. For ii = 0 To FifX1.SearchCount - 1
  10. If (FifX1.GetFileData(ii, sFileName, lLine, lColumn,
  11. sFound) = True) Then
  12. sData = sFileName & " --- " & _
  13. CStr(lLine) & " --- " & _
  14. CStr(lColumn) & " --- " & _
  15. CStr(sFound)
  16. Call lstData.AddItem(sData)
  17. End If
  18. Next ii
  19. Caption = CStr(lstData.ListCount) & " items found from FifX1"
  20. End Sub 
  21.  
Título: Re: Realizar búsqueda de texto en carpeta de archivos .txt
Publicado por: Akemati en Martes 7 de Diciembre de 2010, 14:17
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++
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string>
  4. #include<windows.h>
  5.  

Después poner el siguiente código en el evento Onclick del Botón:

Código: C++
  1. AnsiString Texto;
  2.     AnsiString Texto2;
  3.     char Pbuscar[255];
  4.     char linea[255];
  5.     char *coincidenciast[255];
  6.     char frase[255];
  7.     int contador;
  8.     int longitud;
  9.                 char c;
  10.     FILE *archivo;
  11.     WIN32_FIND_DATA findFileData;
  12.                 HANDLE hFind;
  13.     char dirtmp[255];
  14.     char exttmp[255];
  15.     char dir[255];
  16.     char filename[255];
  17.     char ruta[255];
  18.     std::string str;
  19.     Texto = Edit1->Text; //Recuperar el texto desde el TEdit
  20.     strcpy(Pbuscar,Texto.c_str());
  21.     strcpy(dirtmp, "c:\MiCarpeta\"); //Aquí el directorio conteniendo los archivos a buscar
  22.     strcpy(dir, dirtmp);
  23.     strcat(dir,"\");
  24.     strcat(dirtmp,"*.txt"); //Esta es la extensión de archivos en dónde realiza la búsqueda
  25.     hFind = FindFirstFile(dirtmp, &findFileData);
  26.     if(hFind == INVALID_HANDLE_VALUE)
  27.                    {
  28.                            printf("Directorio no existe o es incorrecto");
  29.                     }
  30.      else
  31.     {
  32.           strcpy(ruta,"");
  33.           str = (std::string)findFileData.cFileName;
  34.     longitud = str.length();
  35.        if(longitud >12)
  36.            {
  37.              str = (std::string)findFileData.cAlternateFileName;
  38.     }
  39.   for(int i=0; i < longitud;i++)
  40.   {
  41.           filename[i] = str[i];
  42.   }
  43.   filename[longitud] = '';
  44.   strcpy(ruta, dir);
  45.   strncat(ruta, filename, strlen(filename));
  46.   contador = 0;
  47.   if((archivo = fopen(ruta,"r")) != NULL)
  48.   {
  49.    while ((fscanf(archivo, "%s%c", linea, &c)) != EOF)
  50.    {
  51.      if(strcmp(linea, Pbuscar) == 0 && *linea != '')
  52.      {
  53.      contador++;
  54.      }
  55.    }
  56.    if(contador>0)
  57.    {      
  58.    }
  59.    fclose(archivo);
  60.   }
  61.   else
  62.   {
  63.     printf("Error al abrir archivo - %s n", ruta);
  64.      getchar();
  65.   }
  66.   fflush(stdin);
  67.   }
  68.  
  69.  while(FindNextFile(hFind, &findFileData) != 0)
  70.  {
  71.    strcpy(ruta,"");
  72.    contador = 0;
  73.    str = (std::string)findFileData.cFileName;
  74.     longitud = str.length();
  75.     if(longitud>12)
  76.    {
  77.        str = (std::string)findFileData.cAlternateFileName;
  78.    }
  79.    for(int i=0; i < longitud;i++)
  80.   {
  81.           filename[i] = str[i];
  82.   }
  83.   filename[longitud] = '';
  84.   strcpy(ruta, dir);
  85.   strncat(ruta, filename, strlen(filename));
  86.   if((archivo = fopen(ruta,"r")) != NULL)
  87.   {
  88.    while ((fscanf(archivo, "%s%c", linea, &c)) != EOF)
  89.    {
  90.       if(strcmp(linea,Pbuscar) == 0 && *linea != '')
  91.      {
  92.          contador++;
  93.      }
  94.    }
  95.     if(contador>0)
  96.     {    strcpy(frase, " coincidencias en ");
  97.             itoa(contador, *coincidenciast, 10);
  98.             strncat(*coincidenciast, frase, strlen(frase));
  99.             strncat(*coincidenciast, ruta, strlen(ruta));
  100.             lstData->Items->Add(*coincidenciast); //Enviar búsqueda a TListBox
  101.  
  102.             }
  103.    fclose(archivo);
  104.   }
  105.   else
  106.   {
  107.     printf("Error al abrir archivo - %s n", ruta);
  108.      getchar();
  109.     //exit(1);
  110.   }
  111.   fflush(stdin);
  112. }
  113.  
  114.  

Una disculpa ya que el código no está ni bien comentado ni optimizado pero a mi me ayudó en mi problema.