gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:58 27 4
gpt4 key购买 nike

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

我的程序目前做的是:

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

本质上,我试图一次读取一行源文件。
每次读取一行时,都会将其附加到 destinationFile。
这会一直循环,直到 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com