2015-11-11 4 views
7

से बनाए गए मैं एक फ़ाइल की सामग्री में हेरफेर करने की जरूरत है:सी # StreamWriter के साथ फाइल को ओवरराइट करने FileStream

FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);    
StreamReader sr = new StreamReader(fs); 
StreamWriter sw = new StreamWriter(fs); 
newString = someStringTransformation(sr.ReadToEnd()); 
sw.Write(newString); 
fs.flush(); 
fs.Close(); 

हालांकि इसके बाद के संस्करण newString बजाय नए परिवर्तन के साथ फ़ाइल को अधिलेखित करने की जोड़ देता है। इसे करने की ज़रूरत है ताकि कोई अन्य एप्लिकेशन किसी लेखन को पढ़ने के बीच फ़ाइल तक पहुंच न सके, इसलिए मैं एक फाइलस्ट्रीम ऑब्जेक्ट से पाठक और लेखक बना रहा हूं।

मुझे पता है कि आप here वर्णित अनुसार दूसरे पैरामीटर सेट के साथ एक StreanWriter बना सकते हैं। हालांकि ऊपर के रूप में StreamWriter बनाते समय यह पैरामीटर में से एक प्रतीत नहीं होता है।

+1

धारा निस्तब्धता और फ़ाइल के शुरू में इसे वापस का स्थान बदलने, तो कोशिश करें लिखना, फिर लेखक को फ्लश करना, फिर फ़ाइल को छोटा करना। –

+0

एक और तरीका एक और अस्थायी फ़ाइल बना रहा है, उस फ़ाइल में सभी नई सामग्री को सहेजें, फिर पुराने को हटाएं और नया नाम बदलें। –

+1

जो भी आप करने का प्रयास कर रहे हैं, उसे कोई समझ नहीं आता है, फ़ाइल खोलने से पहले फ़ाइल को माइक्रोसॉन्ड फ़ाइल पढ़ने के बाद आपको कोई अन्य प्रक्रिया के खिलाफ कोई सुरक्षा नहीं है। –

उत्तर

9

आपकी समस्या यह है कि स्ट्रीम के आगे से फ़ाइल के अंत तक पढ़ना है। आगे लिखने के बाद आगे लिखेंगे।

यह एक पूर्ण ओवरराइट प्राप्त करेगा।

using(FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None) 
{    
    StreamReader sr = new StreamReader(fs); 
    StreamWriter sw = new StreamWriter(fs); 
    newString = someStringTransformation(sr.ReadToEnd()); 

    // discard the contents of the file by setting the length to 0 
    fs.SetLength(0); 

    // write the new content 
    sw.Write(newString); 
} 

SetLength का उपयोग क्यों करें? आपकी नई सामग्री मौजूदा स्ट्रिंग से कम हो सकती है! आखिरी चीज जो आप चाहते हैं वह आपकी फाइल के अंत में पुरानी सामग्री है।

1

कई कदम यहाँ ले लेकिन मुझे मेरी मान्यताओं स्पष्ट कर जाने के लिए की जरूरत है:

आप फ़ाइल को खोलने और इस समय के दौरान फ़ाइल तक पहुँचने से रोकने के लिए पूरे ऑपरेशन के दौरान बंद कर दिया रखने की जरूरत है ।

  1. के रूप में आप
  2. किया है आप, StreamReader का उपयोग कर सामग्री पढ़ने की जरूरत है आप अंतर्निहित स्ट्रीम में वापस स्थान बदलने के लिए की जरूरत है:

ने कहा कि के साथ, यहाँ आप क्या करने की जरूरत है शुरुआत, पाठक

  • के माध्यम से पढ़ने के द्वारा इसकी स्थिति बदल दी गई है StreamWriter के माध्यम से आपको परिवर्तित सामग्री को लिखना होगा, जैसा कि आपने
  • किया है, आपको फ्लश करना होगा अगले चरण
  • की वजह से ई लेखक सामग्री को कम करने वाले परिवर्तन को संभालने के लिए, अंतर्निहित स्ट्रीम/फ़ाइल को अपनी वर्तमान स्थिति में छोटा करने की आवश्यकता है।
  • कोड यह सब इस LINQPad कार्यक्रम की तरह लग सकता है के लिए:

    void Main() 
    { 
        const string filePath = @"d:\temp\test.txt"; 
        var encoding = Encoding.UTF8; 
        using (var stream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) 
        using (var reader = new StreamReader(stream, encoding)) 
        using (var writer = new StreamWriter(stream, encoding)) 
        { 
         // Read 
         var contents = reader.ReadToEnd(); 
    
         // Transform 
         var transformedContents = contents.Substring(0, Math.Max(0, contents.Length - 1)); 
    
         // Write out transformed contents from the start of the file 
         stream.Position = 0; 
         writer.Write(transformedContents); 
         writer.Flush(); 
    
         // Truncate 
         stream.SetLength(stream.Position); 
        } 
    } 
    
    1

    क्या तुम कर सकते हो धाराओं का स्थान बदलने जाता है और यह भी सुनिश्चित करें कि कुछ भी नहीं रास्ते में हो जाता है होना करने के लिए बफ़र डेटा को हटाने के। अपना उदाहरण लेना:

    FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);    
    StreamReader sr = new StreamReader(fs); 
    StreamWriter sw = new StreamWriter(fs); 
    newString = someStringTransformation(sr.ReadToEnd()); 
    
        sr.Position = 0; 
        sr.DiscardBufferedData(); 
    
        sw.Position = 0; 
    
    sw.Write(newString); 
    fs.flush(); 
    fs.Close(); 
    

    यदि नया डेटा पुराने डेटा से कम है तो आपको शेष डेटा को कम करने की आवश्यकता होगी। sw.SetLength(newString.Length); का उपयोग करके।

    1

    आप इन निम्न स्तर Stream की और उनके Reader/Writer रों से बच सकते हैं Linq का उपयोग करके:

    File.WriteAllText(filePath, someStringTransformation(File.ReadAllText(filePath))); 
    
    संबंधित मुद्दे