Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用StreamWriter和控制台输出节省x行数_C#_.net_Windows - Fatal编程技术网

C# 使用StreamWriter和控制台输出节省x行数

C# 使用StreamWriter和控制台输出节省x行数,c#,.net,windows,C#,.net,Windows,我有一个Windows(C#)命令行程序,它使用StreamWriter将控制台输出重定向到文本文件。这一切都很好,但我只需要最后100行日志,我每秒向日志文件写入5次,所以你可以想象这个文件可能有多大。我想做的是每隔大约100行StreamWriter就完全覆盖该文件。有没有人有一个有效的方法来做到这一点 我当前的代码(正在工作)是: 如何调整以每100行覆盖日志文件 提前谢谢 这是我在中提出的建议的代码 //保留最近的100–200行。 列表缓存=新列表(); while(true) { /

我有一个Windows(C#)命令行程序,它使用StreamWriter将控制台输出重定向到文本文件。这一切都很好,但我只需要最后100行日志,我每秒向日志文件写入5次,所以你可以想象这个文件可能有多大。我想做的是每隔大约100行StreamWriter就完全覆盖该文件。有没有人有一个有效的方法来做到这一点

我当前的代码(正在工作)是:

如何调整以每100行覆盖日志文件


提前谢谢

这是我在中提出的建议的代码

//保留最近的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;
        }
    }
}