System.IO.IOException C# 当 FileInfo 和 WriteAllLines

System.IO.IOException C# when FileInfo and WriteAllLines

如果我的文本日志文件的大小大于最大值,我想清理它:

FileInfo f = new FileInfo(filename);
if (f.Length > 30*1024*1024)
{
    var lines = File.ReadLines(filename).Skip(10000);
    File.WriteAllLines(filename, lines);
}

但我有例外

System.IO.IOException: The process cannot access the file '<path>' because it is being used by another process.

问题:

  1. 我需要在以后使用文件之前关闭 FileInfo 对象吗?
  2. 有没有更合适的轮转日志的方法? (例如获取行数而不是字节大小的有效方法?)

File.ReadLines 保持文件打开,直到您处理返回的 IEnumerable<string>

所以这与FileInfo无关。

如果需要写回同一个文件,完整枚举内容:

var lines = File.ReadLines(filename).Skip(10000).ToList();

您提到 "rotating logs",您是否考虑过轮换文件? IE。写入固定文件,当它达到 "full"(根据您认为已满的任何标准,例如 1GB 大小、一天的日志条目、100.000 行等),您重命名文件并创建一个新的,空,一个。

您可能还想重命名现有的旋转文件,以保持较低的旋转文件数量。