2010-12-02 12 views
23

स्ट्रिंग के अंदर स्ट्रिंग को प्रतिस्थापित करें। HTML फ़ाइल की सामग्री के किसी हिस्से को प्रतिस्थापित करते समय रीप्लेस ठीक से काम नहीं कर रहा है। उदाहरण के लिए, स्ट्रिंग। </body></html>blah blah blah </body></html> html> के साथ प्रतिस्थापित करता है - ध्यान दें कि दूसरा HTML क्लोजिंग टैग ठीक से बंद नहीं है और इसलिए उपयोगकर्ता द्वारा ब्राउजर में पृष्ठ को प्रस्तुत किए जाने पर दिखाया जाता है।सी # फ़ाइल

कोई भी जानता है कि यह इरादा के रूप में क्यों काम नहीं कर रहा है?

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

क्या आप अपनी स्रोत फ़ाइल का उदाहरण प्रदान कर सकते हैं? आपके द्वारा सबमिट किया गया कोड * जैसा कि आप वर्णन करते हैं * काम करना चाहिए। मुझे कोई कारण नहीं दिखता है कि आपको अतिरिक्त 'html> 'बिट मिलेगा ... – Nate

+1

क्या कोई मौका है कि उस अतिरिक्त टैग इनपुट फ़ाइल में पहले से ही है? इसके अलावा मुझे कोड उदाहरण में नोटिस है कि आपके पास एक ऑटो बंद बॉडी टैग है, है ना? – MrEyes

+0

नाट - त्वरित उत्तर और सफाई के लिए धन्यवाद। वास्तविक कोड नहीं है, लेकिन मेरे बिंदु को पाने के लिए पर्याप्त बंद करें। – Joey

उत्तर

12

string.Replace के साथ कुछ भी गलत नहीं है।

क्या गलत है कि आप फ़ाइल को अधिलेखित कर रहे हैं, लेकिन यह छोटा नहीं ... इसलिए यदि आप अपने लेखन कोड के लिए सिर्फ

sw.WriteLine("Start"); 

आप देखना चाहते हैं "प्रारंभ" बदल गया है और उसके बाद है बाकी फाइल

मैं अनुशंसा करता हूं कि आप File.ReadAllText और File.WriteAllText का उपयोग करें (FileInfo से पथ लें)। इस तरह:

  • यह पूरी तरह से सिर्फ
  • आप पाठक/लेखक/धारा ठीक से बंद करने के बारे में चिंता करने की जरूरत नहीं है (जो आप अब नहीं कर रहे हैं अधिलेखित, फ़ाइल को बदलने के बजाय करेगा - यदि एक अपवाद तब होता है, तो आप पाठक या लेखक खुला छोड़ रहे हैं)

आप वास्तव में FileInfo विधियों का उपयोग करना FileInfo.Open(FileMode.Create) का उपयोग जो फ़ाइल काटना होगा चाहते हैं।

+0

अच्छी पकड़ ..... – Nate

+0

जॉन - त्वरित उत्तर और स्पष्टीकरण के लिए धन्यवाद। कृपया बताएं कि मुझे उपर्युक्त उदाहरण में पाठक/लेखक/स्ट्रीम को बंद करने की आवश्यकता क्यों नहीं है। - मुझे एहसास है कि मैंने जो कोड प्रदान किया है वह गंदा है। यह विकास से कॉपी नहीं किया गया है, बल्कि सिर्फ मेरा प्रश्न उठाने की कोशिश कर रहा है। – Joey

+0

@ जॉय: यदि कोई अपवाद नहीं है तो आप उन्हें केवल बंद कर दें। आपको जो कुछ भी होता है उसका निपटान करने के लिए 'उपयोग' कथन का उपयोग करना चाहिए - यह कोशिश/अंत में बराबर है। –

52

मैं इस तरह कोड के अपने बिट पुनर्लेखन सकता है:

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

मैं नोट करना चाहिए कि इस समाधान उचित आकार की फ़ाइलों के लिए ठीक है। हार्डवेयर के आधार पर, एमबी के कुछ दसियों के तहत कोई भी चीज़। यह पूरी सामग्री को स्मृति में लोड करता है। यदि आपके पास वास्तव में बड़ी फ़ाइल है तो आपको OutOfMemoryException को रोकने के लिए एक समय में कुछ सौ केबी के माध्यम से इसे स्ट्रीम करने की आवश्यकता हो सकती है। यह चीजों को थोड़ा और जटिल बनाता है, क्योंकि आपको अपनी खोज स्ट्रिंग को विभाजित करने के लिए प्रत्येक खंड के बीच ब्रेक की जांच करने की आवश्यकता होगी।

संबंधित मुद्दे