2013-11-24 10 views
5

Hallo Ich habe ein Problem mit dem Ersetzen eines Textes in einer Textdatei mit Inno-Setup (Delphi-basiert).Ersetzen Sie einen Text in einer Datei mit Inno-Setup

Mein Code:

procedure FileReplaceString(const FileName, searchstring, replacestring: string); 
var 
    fs: TFileStream; 
    S: string; 
begin 
    fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone); 
    try 
     SetLength(S, fs.Size); 
     fs.ReadBuffer(S[1], fs.Size); 
    finally 
     fs.Free; 
    end; 
    { the compiler stops here with: unknown identifier 'StringReplace' } 
    S := StringReplace(S, SearchString, replaceString, [rfReplaceAll, rfIgnoreCase]); 
    fs := TFileStream.Create(FileName, fmCreate); 
    try 
     fs.WriteBuffer(S[1], Length(S)); 
    finally 
     fs.Free; 
    end; 
end; 

Ich fand heraus, dass ich StringChange() verwenden, stattdessen aber ich weiß nicht, wie es mit meinem Code zu verwenden. Ich weiß nicht viel über Delphi oder Inno Setup. Ich hoffe du kannst mir helfen.

+2

'Inno Setup! = Delphi'. Inno Setup ist in Delphi kompiliert, aber es verwendet eine eigene Sprache basierend auf Pascal Script. – TLama

+0

Danke für Ihre Antwort. Wie sollte ich meinen Code jetzt ändern? – user3025417

+0

Enthält diese Eingabedatei einen Unicode-Text? – TLama

Antwort

9

Ich hoffe, diese Funktion macht den Job:

function FileReplaceString(const FileName, SearchString, ReplaceString: string):boolean; 
var 
    MyFile : TStrings; 
    MyText : string; 
begin 
    MyFile := TStringList.Create; 

    try 
    result := true; 

    try 
     MyFile.LoadFromFile(FileName); 
     MyText := MyFile.Text; 

     { Only save if text has been changed. } 
     if StringChangeEx(MyText, SearchString, ReplaceString, True) > 0 then 
     begin; 
     MyFile.Text := MyText; 
     MyFile.SaveToFile(FileName); 
     end; 
    except 
     result := false; 
    end; 
    finally 
    MyFile.Free; 
    end; 
end; 

Ein großes Lob an TLama für Feedback.

+1

Sie können 'if StringChangeEx (...)> 0 dann Text zu String-Liste zuweisen und speichern '. Und das 'OK' ist nicht notwendig. Ordnen Sie '' Result' 'als erste Zeile 'False' zu ​​und weisen Sie' True' nur dann zu, wenn keine Ausnahme vorliegt. – TLama

+0

@TLama, danke für deine Vorschläge. Ich habe den Code geändert, der nach Änderungen am Dateiinhalt sucht. In Bezug auf das zurückgegebene Ergebnis; es gibt auch false zurück, wenn die Datei nicht existiert (keine Ausnahme ausgelöst), so dass ich unverändert gelassen habe. (Meine Absicht, OK anstelle von Ergebnis zu verwenden, ist für Lesbarkeit.) – Lars

+1

IMHO, das überprüfen, ob die Datei außerhalb dieser Funktion existiert, bevor Sie sie aufrufen (stellen Sie sich vor, Sie würden zB 10 Funktionen aufrufen, die mit der gleichen Datei arbeiten und in jedem einzelnen würden Sie fragen, ob diese Datei existiert). Ich weiß, es ist Geschmackssache, aber Sie werden eine Ausnahme auslösen, wenn das Öffnen der Datei aus irgendeinem Grund fehlschlägt (meistens Zugriffsrechte). Warum also nicht eine Expretion auslösen, selbst wenn die Datei nicht geöffnet werden kann, weil sie nicht geöffnet wird existieren? Über dieses 'OK', nun, ich bin so sehr an einen" richtig "geschriebenen Code gebunden, dass ich diese Konstruktion verwirrend finde. Aber nochmal, es ist Geschmackssache :-) – TLama

Verwandte Themen