C# 使用StreamWriter和控制台输出节省x行数
我有一个Windows(C#)命令行程序,它使用StreamWriter将控制台输出重定向到文本文件。这一切都很好,但我只需要最后100行日志,我每秒向日志文件写入5次,所以你可以想象这个文件可能有多大。我想做的是每隔大约100行StreamWriter就完全覆盖该文件。有没有人有一个有效的方法来做到这一点 我当前的代码(正在工作)是: 如何调整以每100行覆盖日志文件C# 使用StreamWriter和控制台输出节省x行数,c#,.net,windows,C#,.net,Windows,我有一个Windows(C#)命令行程序,它使用StreamWriter将控制台输出重定向到文本文件。这一切都很好,但我只需要最后100行日志,我每秒向日志文件写入5次,所以你可以想象这个文件可能有多大。我想做的是每隔大约100行StreamWriter就完全覆盖该文件。有没有人有一个有效的方法来做到这一点 我当前的代码(正在工作)是: 如何调整以每100行覆盖日志文件 提前谢谢 这是我在中提出的建议的代码 //保留最近的100–200行。 列表缓存=新列表(); while(true) { /
提前谢谢 这是我在中提出的建议的代码
//保留最近的100–200行。
列表缓存=新列表();
while(true)
{
//创建新的编写器,覆盖旧文件(如果已存在)。
使用(var streamWriter=newstreamwriter(/*…*/))
{
//从缓存中写入最后100行。
如果(cache.Count>0)
streamWriter.WriteLine(string.Join(Environment.NewLine,cache));
//找到下一行并写下来。
字符串行=/*您的实现*/
streamWriter.WriteLine(行);
//附加到缓存。
cache.Add(行);
//如果达到缓存限制,我们需要回收。
如果(cache.Count==200)
{
//只保留最近的100行。
cache=cache.Skip(100.ToList();
//开始新的迭代,导致文件被覆盖。
继续;
}
}
}
为什么我被否决了?这是一个真正的问题,需要一种有效的处理方法。真正的问题
?:)太自信了?。无论如何,我看不到低效的实现。是的,代码确实有效,但它会无休止地将行写入日志文件,我只需要最后100行,所以我只希望日志文件中出现这100行。希望这是有道理的!:)您可以尝试CodeReview,一个更好的堆栈交换站点。它主要用于精简代码或修复已经运行的代码smoothly@Daveo:您是否需要保留在调用Dispose
之前写入的最后100行,还是需要日志文件在操作过程中的任何时间点包含最近的100行?我喜欢它。非常感谢。:)干杯我没有在代码中处理日期更改(因为我看不到您在代码中是如何处理的),但您可能需要为它们实现一些附加逻辑。开始写入新的日志时,请小心清除缓存。
var streamWriter = new StreamWriter(
string.Format("{0}/logs/{1}.txt",
baseDir, DateTime.Now.ToString("dd-MM-yyyy")),
false,
Encoding.ASCII,
16384
);
streamWriter.AutoFlush = true;
var originalOut = Console.Out;
Console.SetOut(streamWriter);
// .. do my stuff and write lines...
Console.WriteLine("This is a test...");
// ..finished..
Console.SetOut(originalOut);
streamWriter.Dispose();
// Keeps most recent 100–200 lines.
List<string> cache = new List<string>();
while (true)
{
// Create new writer, overwriting old file (if it already exists).
using (var streamWriter = new StreamWriter(/* ... */))
{
// Write last 100 lines from cache.
if (cache.Count > 0)
streamWriter.WriteLine(string.Join(Environment.NewLine, cache));
// Get next line and write it.
string line = /* your implementation */
streamWriter.WriteLine(line);
// Append to cache.
cache.Add(line);
// If cache limit reached, we need to recycle.
if (cache.Count == 200)
{
// Keep only most recent 100 lines.
cache = cache.Skip(100).ToList();
// Start a new iteration, causing the file to be overwritten.
continue;
}
}
}