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.
问题:
- 我需要在以后使用文件之前关闭 FileInfo 对象吗?
- 有没有更合适的轮转日志的方法? (例如获取行数而不是字节大小的有效方法?)
File.ReadLines
保持文件打开,直到您处理返回的 IEnumerable<string>
。
所以这与FileInfo
无关。
如果需要写回同一个文件,完整枚举内容:
var lines = File.ReadLines(filename).Skip(10000).ToList();
您提到 "rotating logs",您是否考虑过轮换文件? IE。写入固定文件,当它达到 "full"(根据您认为已满的任何标准,例如 1GB 大小、一天的日志条目、100.000 行等),您重命名文件并创建一个新的,空,一个。
您可能还想重命名现有的旋转文件,以保持较低的旋转文件数量。
如果我的文本日志文件的大小大于最大值,我想清理它:
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.
问题:
- 我需要在以后使用文件之前关闭 FileInfo 对象吗?
- 有没有更合适的轮转日志的方法? (例如获取行数而不是字节大小的有效方法?)
File.ReadLines
保持文件打开,直到您处理返回的 IEnumerable<string>
。
所以这与FileInfo
无关。
如果需要写回同一个文件,完整枚举内容:
var lines = File.ReadLines(filename).Skip(10000).ToList();
您提到 "rotating logs",您是否考虑过轮换文件? IE。写入固定文件,当它达到 "full"(根据您认为已满的任何标准,例如 1GB 大小、一天的日志条目、100.000 行等),您重命名文件并创建一个新的,空,一个。
您可能还想重命名现有的旋转文件,以保持较低的旋转文件数量。