Advertisement
Guest User

Recortador Multilineas Masivo

a guest
Feb 21st, 2014
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 23.52 KB | None | 0 0
  1. //---------------------------------------------------------------------------
  2.  
  3. #include <vcl.h>
  4. #pragma hdrstop
  5. #include <stdio.h>
  6. #include <Clipbrd.hpp>
  7.  
  8. #include "Unit1.h"
  9. //---------------------------------------------------------------------------
  10. #pragma package(smart_init)
  11. #pragma resource "*.dfm"
  12.  
  13. TForm1 *Form1;
  14.  
  15. //---------------------------------------------------------------------------
  16. __fastcall TForm1::TForm1(TComponent* Owner)
  17.         : TForm(Owner)
  18. {
  19. }
  20. //---------------------------------------------------------------------------
  21.  
  22. void __fastcall TForm1::Button_ComenzarClick(TObject *Sender)
  23. {
  24.         AnsiString salida,Aux;
  25.         char caracter;
  26.         FILE *origen;
  27.         AnsiString ultimo, Cadena, Path_Inicial="", Path_Final="", Directorio="", Control="", NombreArchivo;
  28.         int posicionCadena, largo, largoCadena, error = 0, modificados = 0;
  29.         BOOL encontrado;
  30.         HANDLE hFind;
  31.         WIN32_FIND_DATA busqueda;
  32.  
  33.         if(Edit_Cadena->Text != "")
  34.         {
  35.                 //Deshabilitamos todos los botones o elementos del form que pueda influir
  36.                 //en el correcto funcionamiento su manipulacion durante la ejecucion
  37.                 Edit_Cadena->Enabled = false;
  38.                 GroupBox_Opciones->Enabled = false;
  39.                 Button_Comenzar->Enabled = false;
  40.                 Button_Exportar_Log->Enabled = false;
  41.                 Button_Ver_Log_Modificados->Enabled = false;
  42.                 Button_Ver_Log_No_Encontrados->Enabled = false;
  43.                 Button_Ver_Todo_Log->Enabled = false;
  44.                 Button_Salir->Enabled = false;
  45.                 DirectoryListBoxOrigen->Enabled = false;
  46.                 DriveComboBox1->Enabled = false;
  47.  
  48.                 //Si pusimos alguna extension la concatena detras del asterisco para
  49.                 //asi solo trabajar con los archivos que tengan esa extension y si no
  50.                 //ponemos ninguna trabajaremos con todos los archivos
  51.                 if(EditExtension->Text == "")
  52.                 {
  53.                         Path_Inicial = DirectoryListBoxOrigen->Directory + "\\*.*";
  54.                 }
  55.                 else
  56.                 {
  57.                         Path_Inicial = DirectoryListBoxOrigen->Directory + "\\*." + EditExtension->Text;
  58.                 }
  59.  
  60.                 //Obtenemos el nombre del primer archivo del directorio elegido
  61.                 Path_Final = Path_Inicial;
  62.                 hFind = FindFirstFile((char*)Path_Final.c_str(),&busqueda);
  63.                 Path_Final = busqueda.cFileName;
  64.  
  65.                 ListBox_LogAll->Clear(); //Borramos el log
  66.                 ListBox_LogFounds->Clear(); //Borramos el log
  67.                 ListBox_LogNotFounds->Clear(); //Borramos el log
  68.  
  69.                 while(Path_Final != "") // Si no existen archivos con la extension deseada
  70.                 {
  71.                         //Solo queremos trabajar con archivos que no sean de sistema u ocultos
  72.                         if(busqueda.dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE &&
  73.                         busqueda.dwFileAttributes != FILE_ATTRIBUTE_SYSTEM &&
  74.                         busqueda.dwFileAttributes != FILE_ATTRIBUTE_HIDDEN)
  75.                         {
  76.                                 //Abrimos el archivo para su lectura
  77.                                 origen=fopen(busqueda.cFileName, "r");
  78.  
  79.                                 //Si se pudo abrir...
  80.                                 if(origen)
  81.                                 {
  82.                                         int tmp, x=0, contador=0;
  83.                                         char *mRet=NULL, *buffer=NULL, *salidaRealojada=NULL;
  84.                                         long pos=0, mSize;
  85.  
  86.                                         // Pedimos cuanto pesa el fichero ..
  87.                                         fseek(origen,0,SEEK_END); // Vamos al final
  88.                                         mSize = ftell(origen); // pedimos la posicion
  89.                                         fseek(origen,0,SEEK_SET); // vamos al comienzo
  90.                                         // En mSize tenemos el tamaño del archivo y lo
  91.                                         //podemos usar para crear un buffer para manipularlo
  92.  
  93.                                         //Obtenemos memoria dinamicamente para nuestro buffer
  94.                                         //con el tamaño obtenido en la operacion anterior
  95.                                         buffer = (char*)malloc(mSize);
  96.                                         memset( buffer, 0, mSize );
  97.  
  98.                                         //Copiamos todo el contenido del archivo al buffer
  99.                                         while( !feof(origen) )
  100.                                         {
  101.                                                 buffer[pos]=fgetc(origen);
  102.                                                 pos++;
  103.                                         }
  104.  
  105.                                         //Sustituimos el caracter del EOF por el de fin de cadena
  106.                                         if(buffer[pos-1] == EOF)
  107.                                                 buffer[pos-1] = '\0';
  108.  
  109.                                         //Cerramos la cadena del buffer con el fin de cadena
  110.                                         //buffer[pos]='\0';
  111.  
  112.                                         //Metemos el tamaño de la cadena alojada en el buffer en mSize
  113.                                         mSize = strlen(buffer);
  114.  
  115.                                         //Metemos la cadena a buscar en Cadena para mayor comodidad
  116.                                         Cadena = Edit_Cadena->Text;
  117.  
  118.                                         //Ponemos a false encontrado para que a la salida si no fue
  119.                                         //modificado sabremos que no se encontró la cadena en el archivo
  120.                                         encontrado = false;
  121.  
  122.                                         //Entramos siempre que haya una cadena a buscar y que el buffer
  123.                                         //esté lleno
  124.                                         if(Cadena != "" && mSize > 0)
  125.                                         {
  126.                                                 //Recorremos todo el buffer
  127.                                                 for(long i = 0; i < mSize; i++)
  128.                                                 {
  129.                                                         caracter = buffer[i];
  130.  
  131.                                                         //Esta variable la usaré para saber si se encontró la cadena completa
  132.                                                         tmp = 0;
  133.  
  134.                                                         //Si el caracter obtenido del buffer coincide con el primer caracter de
  135.                                                         //la cadena a buscar...
  136.                                                         if(caracter == Cadena[1])
  137.                                                         {
  138.                                                                 //Guardamos la posicion actual del caracter por si tenemos que volver a el
  139.                                         pos = i;
  140.  
  141.                                                                 //Comprobamos si coincide la cadena al completo
  142.                                                                 for(tmp=1;tmp<=Cadena.Length() && i < mSize; tmp++)
  143.                                                                 {
  144.                                                                         if (caracter==Cadena[tmp])
  145.                                                                         {
  146.                                                                                 i++;
  147.                                                                                 caracter = buffer[i];
  148.                                                                         }
  149.                                                                         else
  150.                                                                         {
  151.                                                                                 break;
  152.                                                                         }
  153.                                                                 }
  154.                                                                 tmp--; //Ajustamos la variable
  155.  
  156.                                                                 if(tmp==Cadena.Length()) //Si coinciden es porque la cadena se ha encontrado
  157.                                                                 {
  158.                                                                         i--; //Ajustamos la posicion para poder continuar leyendo el buffer
  159.                                                                         contador++; //Incrementamos el contador de veces encontrada
  160.                                                                         encontrado = true; //Indicamos que ha sido encontrada
  161.                                                                 }
  162.                                                                 else  //Si no coinciden es porque no se encontró la cadena completa
  163.                                                                 {
  164.                                                                         i = pos; //Vamos al sitio donde se encontró el primer caracter
  165.                                                                         caracter = buffer[i]; //Cogemos el caracter
  166.  
  167.                                                                         //Pedimos mas memoria
  168.                                                                         salidaRealojada = (char*) realloc (mRet, (x+1) * sizeof(char));
  169.  
  170.                                                                         //Si no pudimos obtener mas memoria liberamos la memoria ocupada,
  171.                                                                         //habilitamos todos los elementos de form y salimos del proceso
  172.                                                                         if (salidaRealojada==NULL)
  173.                                                                         {
  174.                                                                                 free (buffer);
  175.                                                                                 free(mRet);
  176.                                                                                 ShowMessage(" Error (re)allocating memory");
  177.                                                                                 Edit_Cadena->Enabled = true;
  178.                                                                                 GroupBox_Opciones->Enabled = true;
  179.                                                                                 Button_Comenzar->Enabled = true;
  180.                                                                                 Button_Exportar_Log->Enabled = true;
  181.                                                                                 Button_Ver_Log_Modificados->Enabled = true;
  182.                                                                                 Button_Ver_Log_No_Encontrados->Enabled = true;
  183.                                                                                 Button_Ver_Todo_Log->Enabled = true;
  184.                                                                                 Button_Salir->Enabled = true;
  185.                                                                                 DirectoryListBoxOrigen->Enabled = true;
  186.                                                                                 DriveComboBox1->Enabled = true;
  187.                                                                                 fclose(origen);
  188.                                                                                 return;
  189.                                                                         }
  190.  
  191.                                                                         //Si pudimos obtener mas memoria guardamos el caracter
  192.                                                                         mRet=salidaRealojada;
  193.                                                                         mRet[x]=caracter;
  194.                                                                         x++;
  195.                                                                 }
  196.                                                         }
  197.                                                         else if(i < mSize) //Y si el primer caracter no coincide...
  198.                                                         {
  199.                                                                 //Pedimos mas memoria
  200.                                                                 salidaRealojada = (char*) realloc (mRet, (x+1) * sizeof(char));
  201.  
  202.                                                                 //Si no pudimos obtener mas memoria liberamos la memoria ocupada,
  203.                                                                 //habilitamos todos los elementos de form y salimos del proceso
  204.                                                                 if (salidaRealojada==NULL)
  205.                                                                 {
  206.                                                                         free (buffer);
  207.                                                                         free(mRet);
  208.                                                                         ShowMessage(" Error (re)allocating memory");
  209.                                                                         Edit_Cadena->Enabled = true;
  210.                                                                         GroupBox_Opciones->Enabled = true;
  211.                                                                         Button_Comenzar->Enabled = true;
  212.                                                                         Button_Exportar_Log->Enabled = true;
  213.                                                                         Button_Ver_Log_Modificados->Enabled = true;
  214.                                                                         Button_Ver_Log_No_Encontrados->Enabled = true;
  215.                                                                         Button_Ver_Todo_Log->Enabled = true;
  216.                                                                         Button_Salir->Enabled = true;
  217.                                                                         DirectoryListBoxOrigen->Enabled = true;
  218.                                                                         DriveComboBox1->Enabled = true;
  219.                                                                         fclose(origen);
  220.                                                                         return;
  221.                                                                 }
  222.  
  223.                                                                 //Si pudimos obtener mas memoria guardamos el caracter
  224.                                                                 mRet=salidaRealojada;
  225.                                                                 mRet[x]=caracter;
  226.                                                                 x++;
  227.                                                         }
  228.                                                 }
  229.  
  230.                                                 //Pedimos mas memoria
  231.                                                 salidaRealojada = (char*) realloc (mRet, (x+1) * sizeof(char));
  232.  
  233.                                                 //Si no pudimos obtener mas memoria liberamos la memoria ocupada,
  234.                                                 //habilitamos todos los elementos de form y salimos del proceso
  235.                                                 if (salidaRealojada==NULL)
  236.                                                 {
  237.                                                         free (buffer);
  238.                                                         free(mRet);
  239.                                                         ShowMessage(" Error (re)allocating memory");
  240.                                                         Edit_Cadena->Enabled = true;
  241.                                                         GroupBox_Opciones->Enabled = true;
  242.                                                         Button_Comenzar->Enabled = true;
  243.                                                         Button_Exportar_Log->Enabled = true;
  244.                                                         Button_Ver_Log_Modificados->Enabled = true;
  245.                                                         Button_Ver_Log_No_Encontrados->Enabled = true;
  246.                                                         Button_Ver_Todo_Log->Enabled = true;
  247.                                                         Button_Salir->Enabled = true;
  248.                                                         DirectoryListBoxOrigen->Enabled = true;
  249.                                                         DriveComboBox1->Enabled = true;
  250.                                                         fclose(origen);
  251.                                                         return;
  252.                                                 }
  253.  
  254.                                                 //Si pudimos obtener mas memoria guardamos el caracter
  255.                                                 mRet=salidaRealojada;
  256.                                                 mRet[x]='\0';
  257.                                         }
  258.  
  259.                                         if(encontrado == true) //Si la cadena fue encontrada...
  260.                                         {
  261.                                                 ListBox_LogFounds->Items->Add("Encontrado y eliminado " + AnsiString(contador) + " veces en \"" + Path_Final + "\".");
  262.                                                 ListBox_LogAll->Items->Add("Encontrado y eliminado " + AnsiString(contador) + " veces en \"" + Path_Final + "\".");
  263.                                                 modificados++;
  264.                                                 Application->ProcessMessages();
  265.                                         }
  266.                                         else  //Y si no fue encontrada...
  267.                                         {
  268.                                                 ListBox_LogNotFounds->Items->Add("No pudo ser encontrado en \"" + Path_Final + "\".");
  269.                                                 ListBox_LogAll->Items->Add("No pudo ser encontrado en \"" + Path_Final + "\".");
  270.                                                 error++;
  271.                                         }
  272.  
  273.                                         fclose(origen); //Cerramos el archivo
  274.  
  275.                                         //Si se encontró la cadena procedemos a guardar los cambios
  276.                                         if(encontrado == true)
  277.                                         {
  278.                                                 origen = fopen(busqueda.cFileName,"w");
  279.                                                 fwrite(mRet, sizeof(char), strlen(mRet), origen);
  280.                                                 fclose(origen);
  281.                                         }
  282.  
  283.                                         //Liberamos la memoria obtenida dinamicamente
  284.                                         free(mRet);
  285.                                         free(buffer);
  286.                                 }
  287.                         }
  288.  
  289.                         //Buscamos el siguiente archivo
  290.                         FindNextFile(hFind,&busqueda);
  291.  
  292.                         //Esto es una forma de controlar cuando llegamos al ultimo archivo del directorio
  293.                         Control = Path_Final;
  294.                         Path_Final=busqueda.cFileName; // Asignamos a Path_Final el nombre del siguiente archivo a mostrar
  295.  
  296.                         if(Control == Path_Final) // Si son iguales es porque ya llegamos al ultimo archivo del directorio
  297.                         {
  298.                                 if(error == 0 && modificados == 0)
  299.                                 {
  300.                                         ListBox_LogAll->Items->Add("No se encontraron archivos con la extension indicada.");
  301.                                         ListBox_LogFounds->Items->Add("No se encontraron archivos con la extension indicada.");
  302.                                         ListBox_LogNotFounds->Items->Add("No se encontraron archivos con la extension indicada.");
  303.                                 }
  304.  
  305.                                 //Escribimos las incidencias en los Logs
  306.                                 ListBox_LogAll->Items->Add("");
  307.                                 ListBox_LogAll->Items->Add("------------------------------------------------------------");
  308.                                 ListBox_LogAll->Items->Add("Se encontraron y modificaron " + AnsiString(modificados) + " archivos.");
  309.                                 ListBox_LogAll->Items->Add("No se encontró en " + AnsiString(error) + " archivos.");
  310.                                 ListBox_LogAll->Items->Add("------------------------------------------------------------");
  311.  
  312.                                 ListBox_LogFounds->Items->Add("");
  313.                                 ListBox_LogFounds->Items->Add("------------------------------------------------------------");
  314.                                 ListBox_LogFounds->Items->Add("Se encontraron y modificaron " + AnsiString(modificados) + " archivos.");
  315.                                 ListBox_LogFounds->Items->Add("------------------------------------------------------------");
  316.  
  317.                                 ListBox_LogNotFounds->Items->Add("");
  318.                                 ListBox_LogNotFounds->Items->Add("------------------------------------------------------------");
  319.                                 ListBox_LogNotFounds->Items->Add("No se encontró en " + AnsiString(error) + " archivos.");
  320.                                 ListBox_LogNotFounds->Items->Add("------------------------------------------------------------");
  321.  
  322.                                 //Mostramos el mensaje adecuado para cada caso
  323.                                 if(error == 0 && modificados == 0)
  324.                                 {
  325.                                         ShowMessage("No hubo ninguna coincidencia");
  326.                                 }
  327.                                 else if(error > 0 && modificados >= 0)
  328.                                 {
  329.                                         ShowMessage("La operacion finalizó con errores");
  330.                                 }
  331.                                 else if(error == 0 && modificados > 0)
  332.                                 {
  333.                                         ShowMessage("La operacion finalizó satisfactoriamente");
  334.                                 }
  335.  
  336.                                 //Dejamos a Path_Final vacia para indicar que ya leimos todos los archivos
  337.                                 Path_Final = "";
  338.                         }
  339.                 }
  340.  
  341.                 //Habilitamos todos los elementos del Form
  342.                 Edit_Cadena->Enabled = true;
  343.                 GroupBox_Opciones->Enabled = true;
  344.                 Button_Comenzar->Enabled = true;
  345.                 Button_Exportar_Log->Enabled = true;
  346.                 Button_Ver_Log_Modificados->Enabled = true;
  347.                 Button_Ver_Log_No_Encontrados->Enabled = true;
  348.                 Button_Ver_Todo_Log->Enabled = true;
  349.                 Button_Salir->Enabled = true;
  350.                 DirectoryListBoxOrigen->Enabled = true;
  351.                 DriveComboBox1->Enabled = true;
  352.         }
  353.         else
  354.         {
  355.                 ShowMessage("No se introdujo ninguna cadena a buscar. Introduzca una cadena e intentelo de nuevo.");
  356.         }
  357. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement