var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
using(var writer = new StreamWriter(fs))
writer.Write(....);
如果以前包含文本的文件和新写入的文本比文件中已有的文本短,那么如何确保文件中过时的尾随内容被截断?
请注意,在这种情况下,以截断模式打开文件不是一个选项。收到FileStream
对象时,该文件已打开。上面的代码只是为了说明流的属性。
修改
扩展下面的答案,解决方案是:
var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
using(var writer = new StreamWriter(fs))
{
writer.Write(....);
writer.Flush();
fs.SetLength(fs.Position);
}
答案 0 :(得分:15)
使用SetLength
设置文件的新长度 - 文件应该被截断。
请参阅this answer相关问题。
答案 1 :(得分:3)
你可以试试writer.BaseStream.SetLength(writer.BaseStream.Position)
虽然我不确定它会有多好用。
对于FileStream,我认为应该将文件截断到当前位置。
答案 2 :(得分:1)
如果文件增长超过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();
}
}