在 Windows 中修改文件夹时通知我的应用程序?

Notify my application when a folder is modified in Windows?

我希望我的应用程序创建的文件夹的所有权只属于我的应用程序。 这是因为我将应用程序的数据链接到文件夹路径。 所以这两种解决方案中的任何一种都适合我:

  1. 不允许任何人修改我的应用程序创建的文件夹。 只有我的应用程序可以 delete/rename 该文件夹。修改它 通过 windows 资源管理器应该需要管理员权限。
  2. 如果上述解决方案不可行,至少应将更改通知我的应用程序,以便更新我的应用程序的链接。

问题是Windows是否可以做到这一点? 我觉得语言没有发挥作用,但如果需要,我仍在使用 C++ 中的 Qt 来开发我的应用程序。

编辑: 现在有 2 种情况被通知:

一个。当我的应用程序是运行并且文件夹被修改时

b。当我的应用程序不是 运行 并且文件夹被修改时(如果 Windows 维护一个文件夹更改的日志文件可以实现。我的应用程序可以读取此日志文件并了解文件夹中的更改).

其实本来想专门问case b的,现在看了答案感觉case b可能通知不到。

您当然可以在目录更改时收到通知 - 有一个特定的 API:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365465%28v=vs.85%29.aspx

通常 运行 在自己的线程中进行此类监视调用以减少丢失通知突发的可能性,以及您处理该通知的方式,以及任何后续 buffering/signaling其他线程,对于 SO 来说有点宽泛。

好像支持异步重叠操作,但是我没有tried/tested

Windows 中的安全性是基于帐户的,而不是基于应用程序的。文件夹不是 "created by your application";它是由用户 运行 您的应用程序创建的。

至于被通知,保持开放句柄即可。这将 防止 在您 运行 时更改文件夹。显然,当您不在 运行 时,您甚至无法收到通知。

[编辑] 当您的应用不是 运行 时,您需要 NTFS change journals

您可以使用 QFileSystemWatcher class 来监控文件和目录的修改。

QFileSystemWatcher *watcher = new QFileSystemWatcher();
watcher->addPath(QStringLiteral("C:\Folder"));
QObject::connect(watcher,&QFileSystemWatcher::directoryChanged,[](QString folder) {
    qDebug() << folder;
});