writeline txt texto por net lineas linea leer escribir ejemplos asp archivo agregar .net io filestream streamwriter

.net - txt - FileStream y StreamWriter-¿Cómo truncar el resto del archivo después de escribirlo?



streamwriter file c# (3)

var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); using(var writer = new StreamWriter(fs)) writer.Write(....);

Si el archivo que contenía anteriormente 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?

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); }


Use SetLength para establecer la nueva longitud del archivo; el archivo debería truncarse.

Ver esta respuesta a una pregunta relacionada.


puedes probar writer.BaseStream.SetLength(writer.BaseStream.Position) aunque no estoy seguro de qué tan bien funcionaría.

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


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