2011-12-11 12 views
16
var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); 
using(var writer = new StreamWriter(fs)) 
    writer.Write(....); 

यदि फ़ाइल में पहले टेक्स्ट था और नया लिखित टेक्स्ट फ़ाइल में पहले से था, तो मैं कैसे सुनिश्चित कर सकता हूं कि फ़ाइल में अप्रचलित पिछली सामग्री को छोटा कर दिया गया है?फ़ाइलस्ट्रीम और स्ट्रीमवाइटर - लिखने के बाद फ़ाइल के शेष को कैसे छोटा करें?

ध्यान दें कि फ़ाइल को ट्रंकेट मोड में खोलना इस मामले में एक विकल्प नहीं है। जब मैं FileStream ऑब्जेक्ट प्राप्त करता हूं तो फ़ाइल पहले से ही खुली है। उपर्युक्त कोड केवल स्ट्रीम की गुणों को चित्रित करने के लिए है।

संपादित

नीचे इस सवाल का जवाब विस्तार करते हुए, समाधान है:

var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); 
using(var writer = new StreamWriter(fs)) 
{ 
    writer.Write(....); 
    writer.Flush(); 
    fs.SetLength(fs.Position); 
} 
+1

जवाब/समाधान कोड मेरे लिए गलत लग रहा है: पढ़ना fs.Position ** से पहले ** writer.Flush या writer.Dipose (बुलाया था) आप वास्तविक बाइट गिनती नहीं देंगे। आपके पास भाग्य है क्योंकि जब स्ट्रीम लिखा जाता है तो धारा स्वचालित रूप से फैलती है, लेकिन आपकी फ़ाइल 2 लम्बाई अपनाने के कारण खंडित अनावश्यक हो सकती है जो 1 लिखने के लिए लागू होती है। – springy76

उत्तर

13

फ़ाइल की नई लंबाई सेट करने के लिए SetLength का उपयोग करें - फ़ाइल को छोटा कर दिया जाना चाहिए।

संबंधित प्रश्न के लिए this answer देखें।

+0

बस उसी समय उत्तर मिला जब आपने इसे पोस्ट किया था। चीयर्स :) –

3

आप writer.BaseStream.SetLength(writer.BaseStream.Position) की कोशिश कर सकते हैं, हालांकि मुझे यकीन है कि कैसे अच्छी तरह से काम करेगा नहीं हूँ।

फ़ाइलस्ट्रीम के लिए मुझे लगता है कि फ़ाइल को वर्तमान स्थिति में छोटा कर देना चाहिए।

1

यदि फ़ाइल 1 एमबी से ऊपर बढ़ती है तो यह कोड लॉग फ़ाइल का हिस्सा छीन लेगा।

using (FileStream fs = File.Open("C:\\LogFile.txt", FileMode.OpenOrCreate)) 
     { 
      int OneMB = 1000000; 

      fs.Seek(0, SeekOrigin.Begin); 
      if (fs.Length > OneMB) 
      { 
       int fileByte = 1; 
       fs.Position = fs.Seek(fs.Length/2, SeekOrigin.Begin); 
       List<byte> bytes = new List<byte>(); 

       while (fileByte > 0) 
       { 
        fileByte = fs.ReadByte(); 
        bytes.Add((byte)fileByte); 
       } 

       fs.SetLength(0); 
       fs.Position = 0; 
       fs.Write(bytes.ToArray(), 0, bytes.Count()); 

       fs.Seek(0, SeekOrigin.End); 
       var stringBytes = UTF8Encoding.ASCII.GetBytes($"Test1" + Environment.NewLine); 
       fs.Write(stringBytes, 0, stringBytes.Length); 
      } 
      else 
      { 
       fs.Seek(0, SeekOrigin.End); 
       var stringBytes = UTF8Encoding.ASCII.GetBytes($"Test2" + Environment.NewLine); 
       fs.Write(stringBytes, 0, stringBytes.Length); 
      } 

      fs.Flush(); 
     } 
    } 
संबंधित मुद्दे