2010-12-02 19 views
23

String.Replace, bir HTML dosyasının içeriğinin bir bölümünü değiştirirken düzgün çalışmıyor gibi görünüyor. Örneğin, String.Replace 'u blah blah blah </body></html> html> ile değiştirir - ikinci HTML kapatma etiketinin düzgün şekilde kapatılmadığını ve bu nedenle sayfa tarayıcıda kullanıcı tarafından oluşturulduğunda görünür.C# dosya içindeki dizeyi değiştir

Niçin amaçlandığı gibi çalışmadığını bilen var mı?

StreamReader sr = fi.OpenText; 
String fileContents = sr.ReadToEnd(); 
sr.close(); 
fileContents = fileContents.Replace("<body>", "<body onload='jsFx();' />"); 
fileContents = fileContents.Replace("</body>","blah blah blah </body>"); 

StreamWriter sw = new StreamWriter(fi.OpenWrite()); 
sw.WriteLine(contents); 
sw.close(); 
+1

Kaynak dosyanızın bir örneğini gösterir misiniz? Gönderdiğiniz kod * açıkladığınız gibi çalışmalı *. Ekstra bir html> '' biti alabilmek için herhangi bir sebep görmüyorum. – Nate

+1

Bu yabancı etiketin zaten girdi dosyasında bulunması ihtimali var mıdır? Ayrıca kod örneğinde otomatik kapali bir vücut etiketine sahip olduğunuzu fark ettim, doğru mu? – MrEyes

+0

Nate - hızlı cevap ve temizleme için teşekkürler. Fiili kod değil, ama karşılığını almak için yeterince yakın. – Joey

cevap

12

string.Replace burada bir sorun yok. sorununun ne

sonra sadece

sw.WriteLine("Start"); 

"Başlat" görürdünüz için yazma kodu değişti ve bu yüzden eğer ... dosyanın üzerine ama onu kesmek değil ki dosyanın geri kalanı.

Bunun yerine File.ReadAllText ve File.WriteAllText kullanın (FileInfo yolunu kullanın). Bu şekilde: Tamamen dosyasını değiştirmek yerine sadece düzgün okuyucu/yazar/akışı kapatılırken endişelenmenize gerek yoktur

  • (şimdi yapmıyorsunuz hangi üzerine yazarak olacaktır

    • - bir if istisnası gerçekten dosyayı keser hangi FileInfo.Open(FileMode.Create) kullanın FileInfo yöntemleri kullanmak isterseniz) açık

    okuyucu veya yazar ayrılıyoruz, ortaya çıkar.

  • +0

    İyi yakalama ..... – Nate

    +0

    Jon - Hızlı cevap ve açıklama için teşekkürler. Lütfen yukarıdaki örnekte neden okuyucu/yazar/akışı kapatmaya ihtiyacım olmadığını açıklayınız. - Sağladığım kodun kirli olduğunu anlıyorum. Gelişimden kopyalanmıyor, sadece sorumu çözmeye çalışıyordum. – Joey

    +0

    @Joey: Sadece istisna yoksa onları kapat. Ne olursa olsun onları bertaraf etmek için 'using' ifadelerini kullanmalısınız - denemek/nihayetinde eşdeğerdir. –

    52

    böyle kod düşeni yeniden olabilir:

    var fileContents = System.IO.File.ReadAllText(@"C:\File.html"); 
    
    fileContents = fileContents.Replace("<body>", "<body onload='jsFx();' />"); 
    fileContents = fileContents.Replace("</body>","blah blah blah </body>"); 
    
    System.IO.File.WriteAllText(@"C:\File.html", fileContents); 
    

    ben bu çözüm makul büyüklükte dosyalar için ince olduğuna dikkat edilmelidir. Donanımına bağlı olarak, onlarca MB'ın altındaki herhangi bir şey. Tüm içeriği belleğe yükler. Gerçekten büyük bir dosyanız varsa, bir OutOfMemoryException'ı önlemek için bir kerede birkaç yüz KB'ye aktarmanız gerekebilir. Bu, işleri biraz daha karmaşık hale getirir, çünkü arama dizginizi bölüp ayırmadığınızı görmek için her bir yığın arasındaki arayı da kontrol etmeniz gerekir.

    İlgili konular