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

nxagd54h  于 2023-08-07  发布在  Windows
关注(0)|答案(4)|浏览(128)

我希望由我的应用程序创建的文件夹的所有权只保留在我的应用程序中。这是因为我将应用程序的数据链接到文件夹路径。所以这两种解决方案对我来说都很好:
1.不允许任何人修改我的应用程序创建的文件夹。只有我的应用程序可以删除/重命名文件夹。通过windows资源管理器修改它应该需要管理员权限。
1.如果上述解决方案是不可能的,至少我的应用程序应通知的变化,使我的应用程序的链接更新。
问题是,是否有可能在Windows中做到这一点?我觉得语言并不起作用,但如果需要的话,我仍然使用C++中的Qt来开发我的应用程序。

**EDIT:**现在有2例被通知:

a.当我的应用程序正在运行并且文件夹被修改时。
B.当我的应用程序没有运行并且文件夹被修改时(如果Windows维护文件夹更改的日志文件,则可以实现此目的。我的应用程序可以读取此日志文件并了解文件夹中的更改)。
实际上,我想问的是具体的情况B,但现在阅读答案让我觉得可能无法得到情况b的通知。

jtjikinw

jtjikinw1#

Windows中的安全性基于帐户,而不是基于应用程序。文件夹不是“由您的应用程序创建的”;它是由运行应用程序的用户创建的。
至于被通知,只要保持一个开放的句柄。这将防止文件夹在您运行时被更改。很明显,当你不跑步的时候,你甚至不能被通知。
[edit]当您的应用未运行时,您需要NTFS change journals

x8diyxa7

x8diyxa72#

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

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

字符串

jhdbpxl9

jhdbpxl93#

你当然可以在直接更改时得到通知-有一个特定的API:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365465%28v=vs.85%29.aspx
通常在它们自己的线程中运行这样的监视调用,以减少错过通知突发的机会,并且您处理的方式,以及任何后续的缓冲/向其他线程发送信号,对于SO来说有点宽泛。
似乎支持异步重叠操作,但我没有尝试/测试过。

enxuqcxy

enxuqcxy4#

您可以使用StorageLibraryChangeTracker API来跟踪文件夹的更改,即使我们的应用没有运行。在https://learn.microsoft.com/en-us/windows/uwp/files/change-tracking-filesystem上有一个教程
如果您的应用使用C++,则需要创建一个C++/WinRT组件并在该组件内调用这些API,然后将API公开给您的主机应用。

相关问题