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

C++ 在Windows中修改文件夹时通知我的应用程序?,c++,windows,qt,directory,C++,Windows,Qt,Directory,我希望应用程序创建的文件夹的所有权仅保留在应用程序中。 这是因为我正在将应用程序的数据链接到文件夹路径。 因此,这两种解决方案中的任何一种都适合我: 不允许任何人修改我的应用程序创建的文件夹。 只有我的应用程序才能删除/重命名文件夹。修改它 通过windows资源管理器应该需要管理员权限 如果上述解决方案不可行,至少应将更改通知我的应用程序,以便更新我的应用程序的链接 问题是,在Windows中是否可以这样做? 我觉得语言不起作用,但如果需要,我在C++中使用Qt来开发我的应用程序。 编辑:现在

我希望应用程序创建的文件夹的所有权仅保留在应用程序中。 这是因为我正在将应用程序的数据链接到文件夹路径。 因此,这两种解决方案中的任何一种都适合我:

  • 不允许任何人修改我的应用程序创建的文件夹。 只有我的应用程序才能删除/重命名文件夹。修改它 通过windows资源管理器应该需要管理员权限
  • 如果上述解决方案不可行,至少应将更改通知我的应用程序,以便更新我的应用程序的链接
  • 问题是,在Windows中是否可以这样做? 我觉得语言不起作用,但如果需要,我在C++中使用Qt来开发我的应用程序。 编辑:现在有两种情况需要通知:

    a。当我的应用程序运行且文件夹被修改时

    b。当我的应用程序未运行且文件夹被修改时(如果Windows维护文件夹更改的日志文件,则可能会实现此目的。我的应用程序可以读取此日志文件并了解文件夹中的更改)


    事实上,我本想特别询问案例b,但现在阅读答案让我觉得可能无法获得案例b的通知。

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

    在自己的线程中运行这样的监视调用是很常见的,目的是减少丢失突发通知的机会,而处理这种情况的方式,以及任何后续的缓冲/向其他线程发送信号的方式,对于这一点来说有点广泛


    异步重叠操作似乎是受支持的,但我还没有尝试/测试过它。

    当目录发生更改时,您肯定会收到通知-它有一个特定的API:

    在自己的线程中运行这样的监视调用是很常见的,目的是减少丢失突发通知的机会,而处理这种情况的方式,以及任何后续的缓冲/向其他线程发送信号的方式,对于这一点来说有点广泛


    异步重叠操作似乎是受支持的,但我还没有尝试/测试它。

    Windows中的安全性是基于帐户的,而不是基于应用程序的。文件夹不是“由应用程序创建的”;它是由运行应用程序的用户创建的

    至于被通知,只需保持一个开放的句柄。这将防止在运行时更改文件夹。显然,当你不跑步时,你甚至无法得到通知

    [编辑]
    当你的应用程序未运行时,你需要

    Windows中的安全性是基于帐户的,而不是基于应用程序的。文件夹不是“由应用程序创建的”;它是由运行应用程序的用户创建的

    至于被通知,只需保持一个开放的句柄。这将防止在运行时更改文件夹。显然,当你不跑步时,你甚至无法得到通知

    [编辑] 当你的应用程序未运行时,你需要

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

    QFileSystemWatcher *watcher = new QFileSystemWatcher();
    watcher->addPath(QStringLiteral("C:\\Folder"));
    QObject::connect(watcher,&QFileSystemWatcher::directoryChanged,[](QString folder) {
        qDebug() << folder;
    });
    
    QFileSystemWatcher*watcher=new QFileSystemWatcher();
    观察者->添加路径(QStringLiteral(“C:\\Folder”);
    QObject::connect(watcher,&QFileSystemWatcher::directoryChanged,[](QString文件夹){
    qDebug()您可以使用类来监视文件和目录的修改

    QFileSystemWatcher *watcher = new QFileSystemWatcher();
    watcher->addPath(QStringLiteral("C:\\Folder"));
    QObject::connect(watcher,&QFileSystemWatcher::directoryChanged,[](QString folder) {
        qDebug() << folder;
    });
    
    QFileSystemWatcher*watcher=new QFileSystemWatcher();
    观察者->添加路径(QStringLiteral(“C:\\Folder”);
    QObject::connect(watcher,&QFileSystemWatcher::directoryChanged,[](QString文件夹){
    

    qDebug()有一个应用程序。对不起--我的意思是“有一个API”。是的,这正是我想要的!你能把这个写下来作为一个答案,这样我就可以把它标记为正确的答案吗?如果可能的话,你能在答案中显示一段工作代码吗?对于b部分:你可以生成并保存文件夹目录树的列表你想跟踪你的程序何时退出。然后在启动你的程序并进行比较时阅读此列表。有一个应用程序用于此。对不起--我的意思是“有一个用于此的API”。是的,这正是我想要的!你能将此作为答案写进去,以便我可以将其标记为正确答案吗?另外,如果可能的话,请你显示答案中的工作代码?对于b部分:当程序退出时,您可以生成并保存要跟踪的文件夹的目录树列表。然后在启动程序并进行比较时重新阅读此列表。这对于案例a来说是一个优雅的解决方案。但对于案例b来说,似乎没有任何解决方案。@Cool_Coder我认为f在第二种情况下,您可以使用文件系统筛选器驱动程序。我假设使用筛选器驱动程序,如果在不同的操作系统实例中访问磁盘,windows将无法跟踪文件夹发生的更改,可能是从linux U盘启动的(除非使用类似bitlocker的东西,否则它可以读取和写入ntfs中的任何文件夹)。更改日志的想法可能会有所帮助,但我怀疑linux ntfs-3g驱动程序是否支持此功能。对于案例a,这是一个优雅的解决方案。但是对于案例b,似乎没有任何解决方案。@Cool_Coder我认为对于案例b,您可以使用文件系统筛选器驱动程序。我假设使用筛选器驱动程序,windows将无法跟踪在不同操作系统实例中访问磁盘时发生的文件夹更改,可能是从linux U盘启动的(除非使用bitlocker之类的工具,否则U盘可以读取和写入ntfs中的任何文件夹)。更改日志的想法可能会有所帮助,但我怀疑linux ntfs-3g驱动程序是否支持。是的,我现在明白了。我想问这个问题是专门针对案例b的。@Cool_Coder:这是最难的案例,但有一个(复杂的)解决方案。事实上,这是一个有一些限制的解决方案。我想我会把这个功能传递给我的应用程序:PYes,我现在就知道了。我的意图是