.net FileStream和StreamWriter -如何在写入后截断文件的剩余部分?

kgqe7b3p  于 2023-11-20  发布在  .NET
关注(0)|答案(3)|浏览(130)
  1. var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
  2. using(var writer = new StreamWriter(fs))
  3. writer.Write(....);

字符串
如果文件以前包含文本,而新写入的文本比文件中已有的文本短,如何确保文件中过时的尾随内容被截断?
请注意,在这种情况下,不能以截断模式打开文件。当我收到FileStream对象时,文件已经打开。上面的代码只是为了说明流的属性。

编辑

扩展下面的答案,解决方案是:

  1. var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
  2. using(var writer = new StreamWriter(fs))
  3. {
  4. writer.Write(....);
  5. writer.Flush();
  6. fs.SetLength(fs.Position);
  7. }

crcmnpdw

crcmnpdw1#

使用SetLength设置文件的新长度-文件应该被截断。
请参阅此相关问题的答案。

6mzjoqzu

6mzjoqzu2#

你可以试试writer.BaseStream.SetLength(writer.BaseStream.Position),虽然我不确定它会有多好。
对于FileStream,我认为应该将文件截断到当前位置。

flmtquvp

flmtquvp3#

如果日志文件超过1MB,此代码将截断部分日志文件。

  1. using (FileStream fs = File.Open("C:\\LogFile.txt", FileMode.OpenOrCreate))
  2. {
  3. int OneMB = 1000000;
  4. fs.Seek(0, SeekOrigin.Begin);
  5. if (fs.Length > OneMB)
  6. {
  7. int fileByte = 1;
  8. fs.Position = fs.Seek(fs.Length / 2, SeekOrigin.Begin);
  9. List<byte> bytes = new List<byte>();
  10. while (fileByte > 0)
  11. {
  12. fileByte = fs.ReadByte();
  13. bytes.Add((byte)fileByte);
  14. }
  15. fs.SetLength(0);
  16. fs.Position = 0;
  17. fs.Write(bytes.ToArray(), 0, bytes.Count());
  18. fs.Seek(0, SeekOrigin.End);
  19. var stringBytes = UTF8Encoding.ASCII.GetBytes($"Test1" + Environment.NewLine);
  20. fs.Write(stringBytes, 0, stringBytes.Length);
  21. }
  22. else
  23. {
  24. fs.Seek(0, SeekOrigin.End);
  25. var stringBytes = UTF8Encoding.ASCII.GetBytes($"Test2" + Environment.NewLine);
  26. fs.Write(stringBytes, 0, stringBytes.Length);
  27. }
  28. fs.Flush();
  29. }

字符串

展开查看全部

相关问题