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

Si el archivo contenía anteriormente texto y el texto recién escrito es más corto que el que ya estaba en el archivo, ¿cómo me aseguro de que el contenido final obsoleto en el archivo se trunca?FileStream y StreamWriter: cómo truncar el resto del archivo después de escribir?

Tenga en cuenta que abrir el archivo en modo truncado no es una opción en este caso. El archivo ya está abierto cuando recibo el objeto FileStream. El código anterior es solo para ilustrar las propiedades de la secuencia.

EDITAR

Ampliando la respuesta a continuación, la solución es:

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

El código de respuesta/solución parece mal a mí: Lectura fs.Position ** ** antes de haber llamado writer.Flush o writer.Dipose() no le dará el número de bytes real. Tienes suerte porque el Stream se expande automáticamente cuando se escribe, pero tu archivo podría fragmentarse innecesariamente debido a las 2 adaptaciones de longitud que se aplican para 1 escritura. – springy76

Respuesta

13

Use SetLength para establecer la nueva longitud del archivo; el archivo se debe truncar.

Consulte this answer a una pregunta relacionada.

+0

Acabo de encontrar la respuesta al mismo tiempo que la publicó. Saludos :) –

3

podría intentar writer.BaseStream.SetLength(writer.BaseStream.Position) aunque no estoy seguro de lo bien que funcionaría.

Para un FileStream, creo que debería truncar el archivo a la posición actual.

1

Este código truncará parte del archivo de registro, si el archivo crece por encima de 1 MB.

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(); 
     } 
    } 
Cuestiones relacionadas