gpt4 book ai didi

c++ - 检测文件是否已更改的可靠方法

转载 作者:可可西里 更新时间:2023-11-01 10:16:55 26 4
gpt4 key购买 nike

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

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

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

我们的程序在 Windows、macOS 和 Linux 上运行,是用 C++ 编写的,我们完全可以使用特定于平台的代码来检测文件更改。我们感兴趣的是最可靠的方法来检测由文件路径标识的文件内容是否已更改,而无需实际读取文件本身。

最佳答案

我已将此答案设为社区 wiki,以便其他人可以针对问题中列出的各种平台添加他们的想法。

Linux

苹果操作系统

Windows

选项1

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

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

选项 2

opportunistic lock 保持文件打开.这涉及通过调用 DeviceIoControl 创建锁,然后发出对 GetOverlappedResult 的阻塞调用,这将在另一个进程尝试更改文件时解除阻塞。您的程序可以释放锁,允许其他进程更新文件,并知道文件正在被更改。

关于c++ - 检测文件是否已更改的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38107632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com