2010-12-02 18 views
23

String.Replace scheint beim Ersetzen eines Teils des Inhalts einer HTML-Datei nicht ordnungsgemäß zu funktionieren. Beispielsweise ersetzt String.Replace </body></html> durch blah blah blah </body></html> html> - Beachten Sie, dass das zweite schließende HTML-Tag nicht ordnungsgemäß geschlossen ist und daher angezeigt wird, wenn die Seite vom Benutzer im Browser gerendert wird.C# Zeichenfolge innerhalb der Datei ersetzen

Wer weiß, warum es nicht wie vorgesehen funktioniert?

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

Können Sie ein Beispiel für Ihre Quelldatei angeben? Der Code, den Sie eingereicht haben, sollte * so funktionieren, wie Sie ihn beschreiben. Ich sehe keinen Grund, warum Sie ein zusätzliches 'html>' Bit bekommen würden ... – Nate

+1

Besteht die Möglichkeit, dass dieses überflüssige Tag bereits in der Eingabedatei ist? Außerdem merke ich im Codebeispiel, dass Sie ein automatisch geschlossenes Body-Tag haben, ist das richtig? – MrEyes

+0

Nate - danke für die schnelle Antwort und Aufräumaktion. Nicht wirklich Code, aber nahe genug, um meinen Standpunkt klar zu machen. – Joey

Antwort

12

Es ist nichts falsch mit string.Replace hier.

Was falsch ist, ist, dass Sie die Datei überschreiben sind, aber es nicht Kürzen ... also, wenn Sie Ihr Schreiben von Code geändert nur

sw.WriteLine("Start"); 

würden Sie auf „Start“ und dann sehen die Rest der Datei.

Ich würde empfehlen, dass Sie stattdessen File.ReadAllText und File.WriteAllText verwenden (nehmen Sie den Pfad von FileInfo). Auf diese Weise:

  • Es wird vollständig die Datei ersetzen, anstatt nur zu überschreiben
  • Sie müssen nicht über das Schließen des Leser/Schreiber/Strom richtig kümmern (die Sie nicht jetzt gerade - wenn ein Ausnahme auftritt, Sie verlassen den Leser oder Schreiber geöffnet)

Wenn Sie wirklich die Fileinfo-Methoden verwenden möchten, verwenden Sie FileInfo.Open(FileMode.Create), welche die Datei gestutzt wird.

+0

Guter Fang ..... – Nate

+0

Jon - Danke für die schnelle Antwort und Erklärung. Bitte erläutern Sie, warum ich den Reader/Writer/Stream im obigen Beispiel nicht schließen müsste. - Ich weiß, dass der Code, den ich zur Verfügung gestellt habe, schmutzig ist. Es wird nicht von der Entwicklung kopiert, sondern versucht nur meine Frage zu beantworten. – Joey

+0

@Joey: Sie schließen sie nur, wenn es keine Ausnahme gibt. Sie sollten 'using' Anweisungen verwenden, um sie zu beseitigen, was auch immer passiert - es ist gleichbedeutend mit try/finally. –

52

Ich könnte Ihr Stück Code wie folgt umschreiben:

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); 

Ich sollte anmerken, dass diese Lösung für Dateien von angemessener Größe in Ordnung ist. Abhängig von der Hardware, etwas unter ein paar Dutzend MB. Es lädt den gesamten Inhalt in den Speicher. Wenn Sie eine sehr große Datei haben, müssen Sie sie möglicherweise einige hundert KB gleichzeitig streamen, um eine OutOfMemoryException zu vermeiden. Das macht die Dinge etwas komplizierter, da Sie auch die Pause zwischen den einzelnen Chunks überprüfen müssen, um zu sehen, ob Sie Ihre Suchzeichenfolge teilen.

Verwandte Themen