使用Qt监视Mac osx下的无限文件/文件夹

时间:2012-05-26 07:59:59

标签: qt file-monitoring

我正在使用 Qt 4.7.4

开发针对 Mac OSX 10.6 + 的应用程序

我有一个包含多达1000个文件的文件夹+,可能会重命名或移动或删除部分或多个甚至所有这些文件,因此我想在以下情况下向我的应用程序报告:

  1. 重命名文件(报告原始文件并重命名为文件名)
  2. 重命名文件夹(报告原始文件夹和重命名的文件夹名称)
  3. 删除文件/文件夹(仅将其报告为已删除)/移动(报告移动的位置)
  4. 问题:是底层系统可能(它的MAY)只允许256个描述符被监控,所以最多256个文件!我怎么能过来这个?

    注意:使用QFileSystemWatcher接口(它有上述问题)

    另请注意:如果版本低于OSX 10.5,如何处理

    请注意我如何重命名文件名/ foldername

1 个答案:

答案 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自行编写代码,找到一个可以满足您需求的库(或保证满足您的需求),或者您需要重新设计应用程序。以可移植的方式“观看”目录充其量是非常棘手的,并且通常会出现竞争和错误。如果我是你,我就不会太乐观,特别是如果你的设计要求不要错过任何“事件”。