我正在使用 Qt 4.7.4
开发针对 Mac OSX 10.6 + 的应用程序我有一个包含多达1000个文件的文件夹+,可能会重命名或移动或删除部分或多个甚至所有这些文件,因此我想在以下情况下向我的应用程序报告:
问题:是底层系统可能(它的MAY)只允许256个描述符被监控,所以最多256个文件!我怎么能过来这个?
注意:使用QFileSystemWatcher
接口(它有上述问题)
另请注意:如果版本低于OSX 10.5,如何处理
请注意我如何重命名文件名/ foldername
答案 0 :(得分:1)
来自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自行编写代码,找到一个可以满足您需求的库(或保证满足您的需求),或者您需要重新设计应用程序。以可移植的方式“观看”目录充其量是非常棘手的,并且通常会出现竞争和错误。如果我是你,我就不会太乐观,特别是如果你的设计要求不要错过任何“事件”。