c# - 检查文件末尾的固定长度标记

标签 c# parsing streamreader

我有一个应用程序,我的任务是在之后进行清理。该应用程序本身相对简单——它运行一个 SQL 查询,使用一个 Web 服务,并将结果输出到一个日志文件中。我的工作是在应用程序完成后将文件存档到我们的 NAS。它会独占锁定文件,直到处理完它们,所以它增加了一点点复杂性。我也不允许触摸应用程序,只能触摸日志。无论如何,我的应用程序相当简单:

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

我的代码有效,只是非常耗时(每个日志文件大约 500 MB)。我的改进想法是从文件底部而不是顶部开始搜索,但 StreamReader 不支持这种方法。我不能使用 ReadToEnd 方法然后反向读取,因为这只会引发内存不足异常。关于加快日志文件解析的方法有什么想法吗?

最佳答案

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

如果以上假设正确,你可以打开FileStream,Seek到文件末尾减去预期的标记长度读取字节,如果标记存在且完整,您就知道可以处理文件。

可以使用如下代码完成-3字节的查找

// Seek -3 bytes starting from the end of the file
fileStream.Seek(-3, SeekOrigin.End);

关于c# - 检查文件末尾的固定长度标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2976340/

相关文章:

c# - StreamReader 区分大小写

c# - 枚举应该放在单独的文件中还是放在另一个类中?

parsing - 编写解析器(用于标记语言): Theory & Practice

asp.net - .NET StreamReader 不会关闭

c# - 使用 Emgucv 比较两个图像

c# - 如何保护在 SignalR 中监听的事件?

java - DOM 解析器因具有 DOCTYPE 声明的 HTML 而卡住

java - 是什么让 Java 比 C 更容易解析?

c# - 在 C# 中使用流读取大文本文件

c# - 为什么我得到 "could not find file '\[文件名 ]'"?