【问题标题】:Remembering the last position in a .txt file in C#?还记得 C# 中 .txt 文件中的最后一个位置吗?
【发布时间】:2017-01-24 16:33:32
【问题描述】:

我发现自己陷入了某个问题。目前我正在用 C# 编写一个程序,读取 .txts。这些 .txt 文件不断变化,因为内容正在被添加到其中。

我创建了一个 FileSystemWatcher,它将文件名传递给在我的 txt 中读取的方法。现在我想要介于两者之间的东西,它会记住我在 txt 中读到的最后一个位置,然后只传递新的部分。

下次启动程序时也需要记住它。

我曾考虑将最后一行存储在 xml 或 txt 中,然后让我的方法在该文件中搜索最后一行。

我发现的唯一类似问题是:Read log file from last read position。不过我不是很懂。

有没有什么方法可以更高效或更优雅地做到这一点?

编辑:我已经链接了建议的问题,不,它与我的不相似。我希望将有关我在 .txt 中的信息永久存储,而不仅仅是在运行时。

【问题讨论】:

  • 您的程序是否在读取日志文件之间关闭?如果不是,则不需要将值存储到文件中。
  • Dictionary<string, int> 似乎是一个合理的选择。您冷使用小写文件路径作为键,最后读取位置作为值。
  • 这听起来像是两个独立的问题:1)你正在寻找一种方法来读取文件的一部分,给定一个已知的偏移量(stream.seek 可以做到)2)你想保存一个重新启动之间的任意值。 (有很多方法可以做到这一点。Ini 文件、注册表、app.config,甚至可能是 NTFS 替代数据流)
  • @BenVlodgi 是的,是的!不过我不太明白你的回答。
  • @InBetween 我不记得字典对象要永久存储。

标签: c# input filesystemwatcher


【解决方案1】:

当您需要在运行时之间在 Windows 平台上存储有限数量的程序状态信息时,通常可以使用 Windows 注册表。这是一个 stackoverflow 问题,它将向您展示如何操作。使用 HKEY_CURRENT_USER 这样您就不会遇到 UAC/管理员权限问题:

Writing to registry in a C# application

【讨论】:

    【解决方案2】:

    .NET 4.0

    这会有帮助吗?一种方法是存储行号,而不是存储读取的最后一行的内容。

    从 .NET 4.0 开始,可以直接访问文件的单行。例如,访问第 15 行:

    string line = File.ReadLines(FileName).Skip(14).Take(1).First(); 这将只返回所需的行

    【讨论】:

    • 这段代码仍然会在后台读取文件的前 14 行,与自己读取和丢弃这些行相比没有性能优势。可以只访问文件的特定部分,但不能使用这种语法,并且您需要知道字节偏移量,而不仅仅是行号。例如 Stream.seek 就可以了。
    • 知道了!将在 stream.seek 上进行更多探索。感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2015-10-28
    • 2014-06-29
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多