【问题标题】:How to check if file was changed since it was last read from? (C#)如何检查文件自上次读取以来是否已更改? (C#)
【发布时间】:2010-07-17 21:18:40
【问题描述】:

我有一个文本文件,同一应用程序的多个实例使用该文本文件在它们之间同步和交换数据。简而言之,它是一个包含数据文件列表的纯文本文件。这些数据文件定期来来去去。

是否有可靠的方法可以知道某些应用程序在上次读取文件后写入了该文件?通常你会使用修改日期。然而,该文件被如此频繁地访问,以至于它可能会一直存在于内存缓存中。因此,写入文件可能不会改变修改日期。

有没有其他方法可以知道文件已更改。

我知道文件系统通知,但不想在这里使用它们。

该软件是用 C# 编写的,但显然我也可以通过 InteropServices 使用任何 WinAPI 函数。软件在 Windows Server 2008 R2 上运行。文件系统为 NTFS。理想情况下,该方法也应该适用于网络共享。

【问题讨论】:

  • 我们是否应该假设您也不想使用 FileSystemWatcher 类?
  • @tvanfosson “我知道文件系统通知,但不想在这里使用它们。”,还是 FileSystemWatcher 不使用这些?
  • @Jouke - 我不确定他是反对使用 FileSysteWatcher 类还是只使用 WinAPI:msdn.microsoft.com/en-us/library/aa364417(VS.85).aspx 所以我问了。我可以很容易地想象不想使用 pinvoke 来获取 WinAPI 函数,但没有意识到有一个类封装了该功能并使其更易于使用。如果他说 FileSystemWatcher,我就不会问了。
  • 我会像其他人提到的那样使用 FileSystemWatcher。
  • 我不明白为什么操作系统缓存会掩盖修改日期 - 如果应用程序写入文件并再次关闭它,修改日期将被设置,无论是否有任何内容实际上是否已刷新到物理磁盘。

标签: c# winapi filesystems


【解决方案1】:

ntfs 的一个有趣但(AFAI)很少使用的功能是它是 USN 期刊,您可以阅读它。它维护对文件系统的所有更改的列表。我知道的唯一明确使用它的程序是 Everything。但可能是 FileSystemWatcher 在内部使用它。手动阅读此日志的一大优势是您可以找出程序未运行时发生的更改。

【讨论】:

    【解决方案2】:

    可能最好使用 sql 数据库。否则,您必须为此文件组织一个事务机制。

    【讨论】:

      【解决方案3】:

      如何使用文件内容的哈希(MD5 或 SHA1 等)来确定文件是否已被修改?

      【讨论】:

        【解决方案4】:

        每次访问文件时保存其哈希 (SHA2),然后在以后再次创建哈希并将其与之前保存的内容进行比较。

        简洁优雅。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-02-23
          • 2018-09-13
          • 2012-04-22
          • 1970-01-01
          • 2018-02-09
          • 1970-01-01
          • 2013-12-01
          相关资源
          最近更新 更多