De momento he conseguido esto:
Código PHP:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
std::auto_ptr<TMemoryStream> pms(new TMemoryStream);
std::auto_ptr<TMemoryStream> pms2(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(c == EditTextOriginal->Text[1]){
pos = pms->Position - 1;
for(i=2; i <= EditTextOriginal->Text.Length(); ++i){
pms->Read(&c,1);
if(c != EditTextOriginal->Text[i])
break;
}
i--;
if(i == 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.