2011-11-27 15 views
6

Supongo que mi título no es tan claro.C# - FileStream: ambos bloquean un archivo y, al mismo tiempo, pueden leerlo sin truncarlo y escribirlo truncándolo

Voy a tratar de explicar:

puedo escribir y leer un archivo mediante 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(); 
} 

De esta manera otros programas no pueden utilizar el archivo, pero tampoco puedo eliminar contenido. Escribir solo agrega la cadena, no reemplaza el contenido.

O puedo hacerlo sin 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(); 
} 

De esta manera, el contenido del archivo se sustituye, pero no tiene ningún bloqueo en los archivos.

Pero quiero ambos. ¿Cuál es la solución?

+0

Truncar con FileStream.SetLength() –

Respuesta

13

En el primer ejemplo, es necesario restablecer la corriente antes de escribir en ella con el fin de reemplazar el contenido del archivo, en lugar de añadir a ella:

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, yo no creo que esto es una buena manera de hacerlo. Lo que sugieres, por lo que he probado, funcionaba como el modo "insertar" en texteados. Si el texto anterior fue mucho más largo, solo se sobrescribirán los primeros caracteres. Por ejemplo, el archivo contiene "OOOOOOOOOO" y escribo "IIIII" en el archivo de mi programa, el archivo contendrá "IIIIOOOOO". – pikachu

+0

@pikachu - ¿Lo has probado? – Oded

+1

Sí, lo probé. – pikachu

0

Si truncar la corriente a 0, también funcionará y no es necesario calcular el nuevo tamaño de archivo en bytes.

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