反向流读取器

mon*_*nja 5 c# parsing streamreader

我有一个应用程序,我已经负责清理后.应用程序本身相对简单 - 它运行SQL查询,使用Web服务,并将结果吐出到日志文件中.我的工作是在应用程序完成后将文件存档到我们的NAS.它将文件独占锁定,直到完成它们,因此它增加了一点点复杂性.我也不被允许触摸应用程序,只有日志.无论如何,我的申请很简单:

  1. 检查文件是否可以打开(捕获IOException)并在bool []中将其标记为可访问,如果没有抛出异常.
  2. 浏览标记为true的文件数组,使用ReadLine方法将文件的每一行读入StreamReader.因为应用程序偶尔打嗝并且没有完成,我不能简单地使用IOException来判断文件是否已完成 - 我必须实际解析文本.
  3. 如果找到指示完成的文本,请压缩文件,将存档文件加载到NAS,然后删除原始文件.

我的代码工作,它只是非常耗时(日志文件大约500 MB).我对改进的想法涉及从文件底部而不是从顶部开始我的搜索,但StreamReader不支持这样的方法.我不能使用ReadToEnd方法,然后反向读取,因为这只会引发内存不足异常.有什么想法,我可以加快解析日志文件?

Chr*_*lor 6

我假设您在文件末尾查找单个标记以确定它是否已完成?如果是这样,我还假设标记具有已知长度,例如单个字节或3个字节的序列等.

如果上述假设是正确的,您可以打开FileStream,查找文件的末尾减去预期的标记长度读取字节,如果标记存在并完成,您就知道可以处理该文件.

寻求到最后-3个字节可以使用如下代码完成

// Seek -3 bytes starting from the end of the file
fileStream.Seek(-3, SeekOrigin.End);
Run Code Online (Sandbox Code Playgroud)

  • @ josephj1989,你是说它更快地逐行读取500 MB文件或者直接读取内存友好的块,直到最后才直接寻找到底?为什么多次搜索,我的陈述假设标记位于文件的末尾,因此只有一次搜索. (3认同)