0

我正在使用Qt 4.7.4开发针对Mac OSX 10.6+的应用程序

我有一个包含多达 1000 个文件 + 的文件夹,其中一些或许多甚至所有这些文件可能会被重命名、移动或删除,所以如果出现以下情况,我想向我的应用程序报告:

  1. 文件被重命名(报告原始和重命名的文件名)
  2. 文件夹重命名(报告原始和重命名的文件夹名称)
  3. 文件/文件夹被删除(只报告已删除)/移动(报告移动位置)

问题:底层系统可能(它的可能)只允许监视 256 个描述符,所以最多 256 个文件!我怎么能克服这个?

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

ALSO:如果版本低于 OSX 10.5,如何处理

请提及我如何重命名文件名/文件夹名

4

1 回答 1

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 是FSEventsAPI。您可以在技术概述页面中阅读:

重要的一点是通知的粒度是在目录级别。它只告诉您目录中的某些内容发生了变化,但不告诉您发生了什么变化。

因此,操作系统级别的 API 也不能直接提供您想要的东西。
对于旧版本的 Mac OS X 和 FreeBSD,Qt 使用带有事件过滤器的kqueueAPI 。EVFILT_VNODE该 API 也不提供重命名文件的新名称。

简而言之,要么您需要基于其中一个 API 自己编写代码,找到一个库来完成它(保证满足您的需求),要么您需要重新设计您的应用程序。以可移植的方式“查看”目录充其量是非常棘手的,并且通常容易出现竞争和错误。如果我是你,我不会太乐观,特别是如果你的设计要求不能错过任何“事件”。

于 2012-05-26T08:21:47.770 回答