System.IO.IOException C#当FileInfo和WriteAllLines时

时间:2015-09-13 10:30:32

标签: c# logging io fileinfo

如果文本日志文件的大小超过max:

,我想清理一些文本日志文件
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. 是否有更适合旋转日志的方法? (例如,获得行数而不是字节大小的有效方式?)

1 个答案:

答案 0 :(得分:3)

File.ReadLines保持文件处于打开状态,直到您丢弃返回的IEnumerable<string>

所以这与FileInfo无关。

如果需要将其写回同一文件,请完全枚举内容:

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

你提到&#34;旋转日志&#34;,您是否考虑过旋转文件?即。写入一个固定的文件,当它得到“#34; full&#34; (根据您认为完整的标准,例如1GB大小,一天的日志条目,100,000行等),您重命名该文件并创建一个新的空文件。

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