【问题标题】:System.IO.IOException C# when FileInfo and WriteAllLinesSystem.IO.IOException C# 当 FileInfo 和 WriteAllLines
【发布时间】:2015-09-13 10:30:32
【问题描述】:

如果文本日志文件的大小超过最大值,我想清理一些卷:

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. 是否有更合适的方法来轮换日志? (例如获取行数而不是字节大小的有效方法?)

【问题讨论】:

  • 除非您使用 FileShare.ReadWrite,否则您通常无法打开该文件。 File.ReadLines() 没有,你需要code like this。实现滚动日志文件的最佳方式不是自己动手,而是使用库,例如​​ NLog。

标签: c# logging io fileinfo


【解决方案1】:

File.ReadLines 保持文件打开,直到您处理返回的IEnumerable&lt;string&gt;。

所以这与FileInfo无关。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多