【问题标题】:C++ / Qt: track filesystem changesC++ / Qt:跟踪文件系统更改
【发布时间】:2017-06-08 20:39:17
【问题描述】:

我目前正在尝试实现一个 c++ 程序来监视文件系统上的文件夹。在初始化应用程序时,它会扫描目录并保存一些关于它的元信息。

当程序处于活动状态时发生某些事情时,我可以读取文件夹的更改(例如更改文件夹或文件的名称)。但是,当程序未运行时,我无法跟踪对目录的更改。启动时我会得到

Removed folder X
Added folder Y

而不是

Renamed folder X to Y

是否可以通过路径/名称以外的其他方式识别目录? 如果是,我将如何在 C++/Qt 中收集这些信息?

【问题讨论】:

  • 你能在被监控的文件夹中放置一个隐藏文件以便识别吗?
  • 这对我没有帮助,因为当名称更改时它无法识别目录
  • 我认为这与 QFileSystemWatcher 相结合。虽然如果您的应用程序没有运行,您必须在启动时进行扫描以了解您的标记文件夹是否已移动。

标签: c++ qt filesystems


【解决方案1】:

而不是重新发明轮子,您可以只使用 Qt 文档所述的类 QFileSystemWatcher:-

QFileSystemWatcher 类提供了一个监控接口 用于修改的文件和目录

如果您希望程序一直运行,那么您可能需要考虑创建服务(在 Windows 中)或守护程序(Linux / OSX)。

【讨论】:

  • 但这是否包括在应用程序未运行时对 FS 的更改?
  • 在您添加评论之前编辑。这能回答你吗?
  • 自应用程序上次启动以来获取文件系统更改的唯一可能方法是维护整个文件系统的缓存,然后在启动时遍历整个文件系统,并检查每个文件。如果这对您来说听起来很昂贵,那是因为不幸的是,Linux 中几乎所有的文件索引器在他们想要检查他们没有收到通知的文件时都会这样做。
  • 好吧,部分。我真的不喜欢为此目的构建服务的选项。没有其他方法可以识别目录吗?像 FS 本身用来识别它的 id?
  • 你在写什么平台?
【解决方案2】:

这是特定于文件系统的,但通常是的,这是可能的。我认为 FAT 是主要的例外。但是您不会在 C++ 标准库或 Qt 中找到这方面的代码。这太不寻常了,因此如果不是特定于文件系统的代码,您将需要特定于操作系统的代码。

【讨论】:

    【解决方案3】:

    就像 TheDarkNight 所说,您需要使用 QFileSystemWatcher 来避免可移植性等问题。 但是,如果您想继续您的方法:
    在 GNU/Linux 领域,您可以使用目录的 inode 结构来检查这一点(注意符号链接问题)。 inode 结构有一个索引,例如你可以在 shell 上获取它:

    ls -id /path/to/your/folder
    

    有一个 API 可以访问 inode。你可以google inode struct linux。

    在Windows Garden中,访问struct BY_HANDLE_FILE_INFORMATION中的句柄时可以获取文件id:

    nFileIndexHigh 与文件关联的唯一标识符的高位部分。 有关详细信息,请参阅 nFileIndexLow。 nFileIndexLow 与文件关联的唯一标识符的低位部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 2012-06-23
      • 2011-04-20
      • 1970-01-01
      相关资源
      最近更新 更多