Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-06-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Aplicación búsqueda y reemplazo en múltiples ficheros

Buenas amigos, mi sea es crearme una aplicación la cual le indique un directorio y busque una cadena que yo le indique en todos los archivos y la sustituya por otra que yo también le indique.
La idea es que me permita hacer búsquedas en ASCII, Unicode, y binario y para ello tengo pensado abrir el archivo, volcarlo a la memoria y ahí buscar la cadena y si la encuentra elimino el fichero original y creo uno nuevo y le envío desde el inicio hasta donde fue encontrada la cadena, le envío la cadena nueva y así hasta el final y para todos los archivos.
Quiero que sea eficiente y por eso es la idea de copiarlo a la memoria y trabajar en la memoria.
La cosa es que necesito orientación de cómo volcarlo a memoria y si es un tipo que permita hacer búsquedas y cosas así.
También sobre cómo realizar las busquedas para ASCII, Unicode y binario ya que la cadena será obtenida desde un TEdit.
Gracias por adelantado.
Y una forma de crear un TMemo u otra opción la cual permita que vaya introduciendo caracteres y lo vaya mostrando con el formato 00 00 00 00 00 ... y solo caracteres hexadecimales. Es para el tema de búsquedas binarias.

Última edición por aguml fecha: 12-06-2020 a las 01:05:55.
Responder Con Cita
  #2  
Antiguo 12-06-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Lo que quiero es un componente como este: http://atviewer.sourceforge.net/atbinhex.htm
Solo que este sirve para mostrar el contenido de un archivo y yo lo que quiero es algo como un TMemo en el que yo escriba con el formato Hex de este componente.
¿Conocen alguno así?
Responder Con Cita
  #3  
Antiguo 12-06-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
¿Hay algo como esto para buscar en el volcado del archivo binario?
https://poesiabinaria.net/2013/10/re...y-glibustring/
¿Pero para un buffer y búsquedas en binaria?
Responder Con Cita
  #4  
Antiguo 12-06-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
De momento he conseguido esto:
Código PHP:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    
std::auto_ptr<TMemoryStreampms(new TMemoryStream);
    
std::auto_ptr<TMemoryStreampms2(new TMemoryStream);

    
char c;
    
int i;
    
long pos 0;
    
bool modified false;

    if(
OpenDialog1->Execute()){
        try
        {
            
pms->LoadFromFile(OpenDialog1->FileName);
            do{
                
pms->Read(&c,1);
                
//BUSQUEDA ANSISTRING
                
if(pms->Position EditTextOriginal->Text.Length() <= pms->Size){
                    if(
== EditTextOriginal->Text[1]){
                        
pos pms->Position 1;
                        for(
i=2<= EditTextOriginal->Text.Length(); ++i){
                            
pms->Read(&c,1);
                            if(
!= EditTextOriginal->Text[i])
                                break;
                        }
                        
i--;
                        if(
== EditTextOriginal->Text.Length()){
                            
pms2->Write(AnsiString(EditTextNew->Text).c_str(),EditTextNew->Text.Length());
                            
modified true;
                        }
                        else
                        {
                            
pms->Seek(pos,soBeginning);
                        }
                        
pms->Read(&c,1);

                    }
                }
                
pms2->Write(&c,1);
            }while(
pms->Position pms->Size);

            if(
modified){
                
AnsiString ficheroNuevo OpenDialog1->FileName.SubString(1,OpenDialog1->FileName.Length() - ExtractFileExt(OpenDialog1->FileName).Length()) + "_copia" ExtractFileExt(OpenDialog1->FileName);
                
pms2->SaveToFile(ficheroNuevo);
            }
        }
        catch(...)
        {
            
ShowMessage("Streaming error.");
        }
    }

Con este código consigo hacer lo que quiero en un archivo concreto usando AnsiString para la sustitución. Tengo que seguir estudiando a ver como lo hago para Unicode y para binario. Supongo que para Unicode tendré que usar wchar_t y leer de dos en dos los bytes ¿es así?
Cualquier ayuda me vendrá bien ya que estoy tocando algo que nunca había hecho antes. El tema de leer todos los archivos de un directorio no tengo problemas para hacerlo.
Responder Con Cita
  #5  
Antiguo 12-06-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Buscar y reemplazar fragmentos binarios es relativamente sencillo. Quizás estos hilos te ayuden:
Cargar exe como texto plano
Buscar y reemplazar Bytes
Cambiar cadenas de un proceso en ejecución

Leer el archivo lo puedes hacer como lo hacer en un stream o en un buffer de memoria localizada a bajo nivel del tamaño del archivo y leer sobre el también a bajo nivel (lread)


Saludos.
Responder Con Cita
  #6  
Antiguo 12-06-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
El caso es que yo quiero que se pueda sustituir por cadena de diferentes largos y por eso uso dos TMemoryStream, primero porque creo que será más rápido que ir leyendo desde el archivo y segundo porque voy copiando a un TMemoryStream para poder cambiar el tamaño sin problema. Para el tema de que sea binario, ASCII o Unicode mi código valdría para todos pero la cosa está en el formato de los TEdits que en mi caso son WideString con lo que, si no estoy confundido es Unicode y si quiero buscar AnsiString tengo que convertirlo y lo mismo pasa con una cadena binaria, por ejemplo si meto "31323334" tendré que ir sacando substrings de dos en dos caracteres, colocando "0x" delante, uso ToInt y lo meto en un array de bytes y lo uso para buscar. Esa es la idea que tengo en mente.
Lo que me preocupa es que este metiendo la para en lo que tengo hecho o no.
Si lo ves bien el siguiente paso será meter eso en una función donde reciba las dos cadenas y sus largos respectivos y el tema de binario, Unicode o ASCII se trabaja antes de llamar a la función. Para el tema de convertir la cadena Hex binaria a un array de bytes iría en otra función para que sea todo menos engorroso a la hora de seguirlo.

Última edición por aguml fecha: 12-06-2020 a las 20:58:54.
Responder Con Cita
  #7  
Antiguo 12-06-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Así quedaría mi función de reemplazo:
Código PHP:
bool __fastcall TForm1::Replace(WideString pathBYTE *originalSIZE_T sizeOriginalBYTE *reemplazoSIZE_T sizeReemplazobool overwrite)
{
    
std::auto_ptr<TMemoryStreampmsOriginal(new TMemoryStream);
    
std::auto_ptr<TMemoryStreampmsNuevo(new TMemoryStream);

    
char c;
    
int i;
    
long pos 0;
    
bool founded false;
    
    try
    {
        
pmsOriginal->LoadFromFile(path);
        do{
            
pmsOriginal->Read(&c,1);
            if(
pmsOriginal->Position sizeOriginal <= pmsOriginal->Size){
                if(
== original[0]){
                    
pos pms->Position 1;
                    for(
i=1<= sizeOriginal; ++i){
                        
pmsOriginal->Read(&c,1);
                        if(
!= original[i])
                            break;
                    }
                    if(
== sizeOriginal){
                        
pmsNuevo->Write(reemplazo,sizeReemplazo);
                        
founded true;
                    }
                    else
                    {
                        
pmsOriginal->Seek(pos,soBeginning);
                    }
                    
pmsOriginal->Read(&c,1);

                }
            }
            
pmsNuevo->Write(&c,1);
        }while(
pmsOriginal->Position pmsOriginal->Size);

        if(
founded){
            
WideString pathDestino;
            if(
overwrite)
                
pathDestino path;
            else
                
pathDestino path.SubString(1,path.Length() - ExtractFileExt(path).Length()) + "_copia" ExtractFileExt(path);
            
pmsNuevo->SaveToFile(pathDestino);
        }
    }
    catch(...)
    {
        
ShowMessage("Streaming error.");
    }
    return 
founded;

Si piensas que debo cambiar algo soy todo oídos.
Responder Con Cita
  #8  
Antiguo 13-06-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
La principal duda que tengo es si Unicode, UTF-8 y WideString ().c_bstr() sería lo mismo o si no tiene nada que ver y si es así ¿Como paso de WideString a Unicode? Es para hacer búsquedas en Unicode.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Múltiples ejecuciones de una aplicación Angel.Matilla C++ Builder 7 27-11-2015 19:35:49
Eliminación de múltiples ficheros vía FTP (Indy) JoysticK Internet 2 15-09-2015 13:14:51
como relalizar una busqueda de ficheros con las api bastardo10 API de Windows 1 18-06-2007 13:27:50
Multiples Ventanas en una Aplicacion Nomad Varios 7 18-05-2007 22:12:28
multiples instancias de aplicación nfrfabian Varios 3 09-12-2006 14:55:17


La franja horaria es GMT +2. Ahora son las 19:03:44.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi