2011-11-27 9 views
6

छेड़छाड़ के साथ लिखते हैं। मुझे लगता है कि मेरा शीर्षक स्पष्ट नहीं है।सी # - फ़ाइलस्ट्रीम: दोनों एक फ़ाइल को लॉक करते हैं और साथ ही इसे बिना छेड़छाड़ किए इसे पढ़ने में सक्षम होते हैं और इसे

मैं लिख सकते हैं और का उपयोग कर एक फाइल पढ़ सकते हैं एक FileStream

FileStream fs = new FileStream("C:\\Users\\Public\\text.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); 

private void button1_Click(object sender, EventArgs e) 
{ 
    fs.Seek(0,0); 
    StreamReader sr = new StreamReader(fs); 
    textbox.Text = sr.ReadToEnd(); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    StreamWriter sw = new StreamWriter(fs); 
    sw.Write(textbox.Text); 
    sw.Flush(); 
} 

इस तरह अन्य कार्यक्रमों फ़ाइल का उपयोग नहीं कर सकते, लेकिन मैं यह भी नहीं हटा सकते हैं:

मैं समझाने की कोशिश करता हूँ सामग्री। इसे लिखना केवल स्ट्रिंग जोड़ता है, यह सामग्री को प्रतिस्थापित नहीं करता है।

या मैं एक FileStream बिना यह कर सकते हैं:

private void button1_Click(object sender, EventArgs e) 
{ 
    StreamReader sr = new StreamReader("C:\\Users\\Public\\text.txt"); 
    textBox1.Text = sr.ReadToEnd(); 
    sr.Close(); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    StreamWriter sw = new StreamWriter("C:\\Users\\Public\\text.txt", false); 
    sw.Write(textBox1.Text); 
    sw.Close(); 
} 

इस तरह, फ़ाइल की सामग्री बदल दिया जाता है, लेकिन यह फ़ाइलों पर कोई ताला नहीं है।

लेकिन मुझे दोनों चाहिए। उपाय क्या है?

+0

FileStream.SetLength साथ काटना() –

उत्तर

13

अपने पहले उदाहरण में, आप, धारा पुनर्स्थापित करने के लिए इससे पहले कि आप आदेश फ़ाइल की सामग्री को बदलने के लिए यह करने के लिए लिखने की जरूरत के बजाय यह करने के लिए जोड़कर की:

private void button2_Click(object sender, EventArgs e) 
{ 
    fs.Seek(0,0); 
    fs.SetLength(Encoding.UTF8.GetBytes(textbox.Text).Length)); 
    StreamWriter sw = new StreamWriter(fs); 
    sw.Write(textbox.Text); 
    sw.Flush(); 
} 
+1

नहीं, मैं नहीं लगता है कि यह यह करने के लिए एक अच्छा तरीका है। आप जो सुझाव देते हैं, जहां तक ​​मैंने परीक्षण किया है, पाठकों में "सम्मिलित करें" मोड की तरह काम किया। अगर मेरा पिछला पाठ बहुत लंबा था, तो केवल पहले अक्षर ही ओवरराइट किए जाएंगे। उदाहरण के लिए फ़ाइल में "OOOOOOOOOO" है और मैं अपने प्रोग्राम में फ़ाइल में "IIIII" लिखता हूं, फ़ाइल में "IIIIOOOOO" होगा। – pikachu

+0

@ पिकाचु - क्या आपने इसे आजमाया? – Oded

+1

हां, मैंने कोशिश की। – pikachu

0

आप 0 करने के लिए नीचे धारा छोटा कर देते हैं, यह भी काम करेगा और बाइट्स में नए फ़ाइल आकार की गणना करने की आवश्यकता नहीं है।

fs.Seek(0,0); 
fs.SetLength(0); 
संबंधित मुद्दे