c# - 使用StreamReader/StreamWriter抓取日志导致程序停止响应

标签 c# wpf streamreader streamwriter

我正在尝试使用 StreamReader 和 StreamWriter 从另一个应用程序获取临时输出日志(.txt 格式)。
输出日志始终打开并不断写入。
如果应用程序关闭或崩溃,日志文件最终会被删除,这无济于事 - 因此需要一个可以从此日志中获取信息并保存它的工具。

我的程序当前所做的是:

  • 创建一个新的 .txt 文件,并将该文件的路径存储为 字符串“目标文件”。
  • 查找要读取的 .txt 日志文件,并将该文件的路径存储为 字符串“sourceFile”
  • 然后它将这两个字符串传递给下面的方法。

本质上,我正在尝试一次一行读取 sourceFile。
每读取一行,就会将其追加到目标文件中。
这会一直循环,直到 sourceFile 不再存在(即应用程序已关闭或崩溃并删除其日志)。

此外,sourceFile 可能会变得相当大(有时 100Mb+),并且该程序可能一次处理多个日志。
读取整个日志而不是逐行读取很可能会开始消耗相当多的内存。

private void logCopier(string sourceFile, string destinationFile)
{
    while (File.Exists(sourceFile))
    {
        string textLine;
        using (var readerStream = File.Open(sourceFile, 
                                            FileMode.Open, 
                                            FileAccess.Read, 
                                            FileShare.ReadWrite))
        using (var reader = new StreamReader(readerStream))                                      
        {
            while ((textLine = reader.ReadLine()) != null)
            {
                using (FileStream writerStream = new FileStream(destinationFile, 
                                                                FileMode.Append,
                                                                FileAccess.Write))
                using (StreamWriter writer = new StreamWriter(writerStream))
                {
                    writer.WriteLine(textLine);
                }                   
            } 
        }
    }
}

问题是我的 WPF 应用程序在到达此代码时锁定并停止响应。
为了追踪位置,我在代码的 writerStream 行之前放置了一个 MessageBox,以输出读者正在拾取的内容。
读取日志文件当然没问题,但将其写入文件时似乎存在问题。
一旦到达代码的 using (FileStream writerStream = new FileStream 部分,它就会停止响应。

以这种方式使用 StreamWriter 是无效的,还是我刚刚在代码中做了一些愚蠢的事情?
我也愿意接受比我在这里尝试做的更好的解决方案。

最佳答案

据我所知,您需要将文件从源复制到目标,该文件可能随时被删除。

我建议您使用FileSystemWatcher关注来源file changed event ,然后只需使用 File.Copy 将整个文件从源复制到目标.

关于c# - 使用StreamReader/StreamWriter抓取日志导致程序停止响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23404014/

相关文章:

c# - 在不使用 Round 或 Truncate 的情况下舍入 Double

c# - 静态构造函数/类型初始化器失败时来自 GC 线程的未处理异常

.net - Silverlight 本地化 - 如何覆盖 Windows 区域性

c# - StreamReader 太贪心了

C# 从两个哈希值之间的文件中获取文本

c# - Stream Reader(从 .txt 文件中提取数据以显示在 listBox 中)

c# - 如何在 Property.Settings.Default 中存储图像?

c# - MVC 映射 - RedirectToAction 不起作用

c# - 这个 WPF 错误处理是个好主意吗?

wpf - 织带 sample