2012-05-26 56 views
0

我工作的一個應用程序文件夾有針對性地的Mac OSX 10.6+使用Qt的4.7.4監控無限制的文件/下MAC OSX使用Qt

我有一個文件夾多達1000個文件+和一些或許多,甚至所有這些文件都可以重命名或移動或刪除,所以我想,如果對我的申請報告:

  1. 文件進行重命名(報告原件及更名的文件名)
  2. 文件夾改名(報告原來的和重命名的文件夾名稱)
  3. 文件/文件夾被刪除(只報告爲已刪除)/移動(報告移動位置)

問題:是底層系統可(其MAY)只允許256所描述被如此監控最多256個文件!我怎麼能過來呢?

注:使用QFileSystemWatcher接口(具有上述問題)

ALSO:如何在版本較低的情況下,處理比OSX 10.5

不要提我怎麼改名的文件名/文件夾名

回答

1

QFileSystemWatcher文檔:

在Mac OS X 10.4和所有BSD變種,例如,一個打開的文件描述符是需要d爲每個受監視的文件。默認情況下,某些系統將打開的文件描述符的數量限制爲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。您可以閱讀技術概述頁面:

重要的一點是,通知的粒度在目錄級別。它只告訴你目錄中的某些內容已經改變,但並不告訴你改變了什麼。

因此,OS級別的API不能直接提供您想要的。
對於舊版本的Mac OS X和FreeBSD,Qt使用kqueue API和EVFILT_VNODE事件過濾器。該API不提供重命名文件的新名稱。

簡而言之,您需要根據其中一種API自行編寫代碼,找到能夠滿足您的需求的庫(可以滿足您的需求),否則您需要重新設計應用程序。以便攜方式「觀看」目錄最多是非常棘手的問題,並且通常存在競爭和錯誤傾向。如果我是你,我不會太樂觀,尤其是如果你的設計要求不要錯過任何「事件」。

+0

Ofcourse如果他正在使用Qt Cocoa –

+0

@Mat我已經讀過,我推斷出有一個與其他文件描述符相關的進程和正在監視的文件相關進程的問題已解決,但沒有對256文檔中提到了默認限制 –

+0

@RahulReddy:進程數量有限的文件描述符並不是Qt可以解決的問題,這是應用程序無法覆蓋的操作系統策略(但限制通常是可調的)。 256限制以及「正常」fds被計入該限制的事實是同一件事。 – Mat