2011-11-27 15 views
6

Suppongo che il mio titolo non sia chiaro.C# - FileStream: entrambi bloccano un file e allo stesso tempo sono in grado di leggerlo senza troncarlo e scriverlo con il troncamento di esso

Cercherò di spiegare:

posso scrivere e leggere un file utilizzando un 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(); 
} 

In questo modo altri programmi non possono utilizzare il file, ma anche io non riesco a cancellare soddisfare. Scrivendo solo aggiunge la stringa, non sostituisce il contenuto.

Oppure posso farlo senza un 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(); 
} 

In questo modo, il contenuto del file viene sostituito, ma non ha nessun blocco sui file.

Ma io voglio entrambi. Qual'è la soluzione?

+0

Tronca con FileStream.SetLength() –

risposta

13

Nel vostro primo esempio, è necessario ripristinare il flusso prima di scrivere ad esso al fine di sostituire il contenuto del file, invece di aggiungere ad esso:

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

No, non credo che questo sia un buon modo per farlo. Quello che suggerisci, per quanto ho provato ha funzionato come la modalità "inserisci" in texteditors. Se il mio precedente testo era molto più lungo, solo i primi caratteri verranno sovrascritti. Ad esempio il file contiene "OOOOOOOOOO" e scrivo "IIIII" nel file nel mio programma, il file conterrà "IIIIOOOOO". – pikachu

+0

@pikachu - L'hai provato? – Oded

+1

Sì, l'ho provato. – pikachu

0

Se si troncano il flusso fino a 0, funzionerà anche e non è necessario calcolare la nuova dimensione del file in byte.

fs.Seek(0,0); 
fs.SetLength(0);