我正在尝试使用 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/