检测文件是否更改的可靠方法



认为这个问题在我的用例中还没有得到回答。

我们希望检测用户是否在不重新读取文件内容的情况下更改了文件,以便缓存基于文件内容的计算结果。我们的程序是一个长时间运行的程序,它允许用户单击一个按钮来执行基于程序中输入的数据和存储在外部文件中的数据的计算(对不起,我不能比这更具体)。外部数据需要被读取、处理,并且需要在此基础上构建各种数据结构,因此我们尝试在计算之间缓存这些数据,以便在用户更改程序本身的数据而不是更改外部文件中的数据时加快重新计算的速度。但是,如果外部文件发生了变化,我们必须重新读取。

对于每个外部资源,我们检查修改时间和文件大小是否发生了变化,但这并不是真的那么强大,如果他们有相同大小和时间戳的fileA和fileB,并复制或fileA到fileC,使用fileC作为外部资源,然后复制fileB到fileC,可能会导致用户沮丧。系统保留原文件的修改时间,大小不变,不需要重新读取外部资源

我们的程序运行在Windows, macOS和Linux上,是用c++编写的,我们完全可以使用特定于平台的代码来检测文件更改。我们感兴趣的是在不实际读取文件本身的情况下,以最可靠的方式检测由文件路径标识的文件的内容是否发生了更改。

我把这个答案做成了一个社区wiki,这样其他人就可以为问题中列出的各种平台添加他们的想法。

<标题> <标题> MacOS h1> Windows h1> 项1

设置一个线程监视包含该文件的目录。当目录改变时,您必须检查您关心的文件是否真的改变了。这可能意味着打开并重新读取文件(例如,计算当前的校验和)。但是,由于您必须在更改通知之后才执行此操作,因此此开销可能是可以接受的。

我相信(但还没有验证),如果有人在现有文件上复制相同大小,相同时间戳的文件,您将收到目录更改通知。

选项2

使用机会锁保持文件打开状态。这包括通过调用DeviceIoControl创建锁,然后对GetOverlappedResult发出阻塞调用,当另一个进程试图更改文件时,阻塞将解除。您的程序可以释放锁,允许其他进程更新文件,并知道文件正在被更改。

相关内容

  • 没有找到相关文章

最新更新