2013-11-24 26 views
5

Merhaba Inno Setup (Delphi tabanlı) ile bir metin dosyasındaki bir metnin değiştirilmesiyle ilgili bir sorunum var.Inno Setup ile bir dosyadaki metni değiştirin

Benim Kod:

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; 

yerine, ben StringChange() kullanmak zorunda öğrendim ama benim koduyla nasıl kullanılacağını bilmiyorum. Delphi veya Inno Setup hakkında fazla bir şey bilmiyorum. Umarım bana yardımcı olabilirsin.

+2

'Inno Setup! = Delphi'. Inno Kur, Delphi'de derlenmiştir, ancak Pascal Script'i temel alarak kendi dilini kullanır. Cevabınız için – TLama

+0

Thx. Peki şimdi kodumu nasıl değiştirmeliyim. – user3025417

+0

Giriş dosyası bir Unicode metni içeriyor mu? – TLama

cevap

9

Bu fonksiyon işi yapar umut:

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; 

Kudos tlama için geri bildirim için.

+1

'StringChangeEx (...)> 0 'yı kullanıp, String listesini metine atama ve kaydet' seçeneğini kullanabilirsiniz. Ve bu 'Tamam' gerekli değildir. Sadece ilk satır olarak 'Hata '' 'Sonuç' 'atayın ve herhangi bir istisna olmazsa sadece' Doğru 'atayın. – TLama

+0

@TLama, önerileriniz için teşekkürler. Dosya içeriğinde yapılan değişiklikleri kontrol eden kodu değiştirdim. İade edilen sonuç ile ilgili olarak; Dosya mevcut değilse (ayrıca istisna oluşturulmamışsa) false değerini döndürür, böylece değişmeden kaldım. (Sonuç yerine Tamam kullanmama niyetim okunabilirlik içindir.) – Lars

+1

IMHO, dosyanın mevcut olup olmadığını kontrol etmeden önce, bu işlevin dışında yapılmalıdır (örneğin, aynı dosya ile çalışan 10 işlevi çağırırsınız) her birinde aynı dosyanın mevcut olup olmadığını sorarsınız. Biliyorum, bu tat meselesi, ancak dosya açma işlemi bir nedenden dolayı başarısız olursa (çoğunlukla erişim hakları) bir istisna oluşturacaksınız, bu yüzden dosya açılmasa bile bir açılma yetkisi olmasın. var olmak ? Bu konuda "Tamam", ben, "düzgün" yazılı bir kodla çok bağlıyım, inşaatın kafa karıştırıcı olduğunu öğreniyorum. Ama yine, bu iyi bir noktaya sahip bir tat :-) – TLama

İlgili konular