强大的方法来检测文件是否已经改变

认为这个问题还没有得到解决,我的用例。

我们希望检测用户是否为了根据文件内容caching计算结果而不重新读取其内容而改变了文件。 我们的程序是一个长期运行的程序,用户可以点击一个button,根据程序中input的数据和存储在外部文件中的数据进行计算(对不起,我不能更具体)。 需要对外部数据进行读取,处理,并在此基础上构build各种数据结构,所以我们试图在计算之间caching这些数据,以加速用户在程序本身中更改数据时的重新计算,而不是数据在外部文件中。 但是,如果外部文件已经更改,我们必须重新阅读。

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

我们的程序在Windows,MacOS和Linux上运行,使用C ++编写,我们完全可以使用特定于平台的代码来检测文件更改。 我们感兴趣的是最强大的方法来检测文件path标识的文件的内容是否已经改变,而不实际读取文件本身。

我已经将这个答案作为一个社区维基,以便其他人可以将他们的想法添加到问题中列出的各种平台。

Linux的

苹果系统

视窗

选项1

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

我相信(但没有验证),如果有人复制一个相同大小,相同的时间戳文件在现有的文件,你会得到一个目录更改通知。

选项2

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