从QFileSystemWatcher
文档:
例如,在 Mac OS X 10.4 和所有 BSD 变体上,每个受监视的文件都需要一个打开的文件描述符。某些系统默认将打开文件描述符的数量限制为 256。这意味着如果您的进程尝试向文件系统监视器添加超过 256 个文件或目录,则 addPath() 和 addPaths() 将失败。另请注意,除了被监视文件的文件描述符之外,您的进程可能还打开了其他文件描述符,并且这些其他打开的描述符也计入总数。Mac OS X 10.5 及更高版本使用不同的后端,不会遇到此问题。
因此,在您的情况下,您根本不需要担心这一点。
QFileSystemWatcher
未提供您在编辑中要求的信息。当它监控的路径之一发生变化时,它会发出信号,但在重命名的情况下,您将不会获得新名称。它更多地用于文件管理器程序之类的东西,它们只会在收到此类事件时更新/重新加载其当前视图。
如果您需要更多信息,则需要使用操作系统特定的 API。您可以在 Qt 源代码中查看 Qt 用于不同平台的代码。它在src/core/io/qfilsystemwatcher_*.[h|cpp]
。
对于 Mac OS X 10.5 或更高版本,使用的底层 API 是FSEvents
API。您可以在技术概述页面中阅读:
重要的一点是通知的粒度是在目录级别。它只告诉您目录中的某些内容发生了变化,但不告诉您发生了什么变化。
因此,操作系统级别的 API 也不能直接提供您想要的东西。
对于旧版本的 Mac OS X 和 FreeBSD,Qt 使用带有事件过滤器的kqueue
API 。EVFILT_VNODE
该 API 也不提供重命名文件的新名称。
简而言之,要么您需要基于其中一个 API 自己编写代码,找到一个库来完成它(保证满足您的需求),要么您需要重新设计您的应用程序。以可移植的方式“查看”目录充其量是非常棘手的,并且通常容易出现竞争和错误。如果我是你,我不会太乐观,特别是如果你的设计要求不能错过任何“事件”。