0

Qt4.7.4を使用してMacOSX10.6以降を対象としたアプリケーションに取り組んでいます

1000個ものファイルを含むフォルダーがあり、これらのファイルの一部または多く、あるいはすべてが名前変更、移動、または削除される可能性があるため、次の場合にアプリケーションに報告したいと思います。

  1. ファイルの名前が変更されました(元のファイルと名前が変更されたファイル名を報告してください)
  2. フォルダの名前が変更されました(元のフォルダ名と名前が変更されたフォルダ名を報告してください)
  3. ファイル/フォルダが削除されました(削除されたものとして報告するだけです)/移動されました(移動された場所を報告します)

問題:基盤となるシステムでは、256個の記述子しか監視できない可能性があるため、最大で256個のファイルを監視できます。どうすればこれを乗り越えることができますか?

注:使用されQFileSystemWatcherているインターフェース(上記の問題があります)

また:OSX10.5より前のバージョンの場合の処理​​方法

ファイル名/フォルダ名の名前を変更する方法を教えてください

4

1 に答える 1

1

QFileSystemWatcherドキュメントから:

たとえば、Mac OS X 10.4 およびすべての BSD バリアントでは、監視対象のファイルごとにオープン ファイル記述子が必要です。一部のシステムでは、デフォルトで開いているファイル記述子の数が 256 に制限されています。これは、プロセスが 256 を超えるファイルまたはディレクトリをファイル システム モニターに追加しようとすると、addPath() および addPaths() が失敗することを意味します。また、監視対象のファイルの記述子に加えて、プロセスで他のファイル記述子が開かれている場合があり、これらの他の開いている記述子も合計にカウントされることに注意してください。Mac OS X 10.5 以降では別のバックエンドを使用しているため、この問題は発生しません。

したがって、あなたの場合、これについてまったく心配する必要はありません。

QFileSystemWatcher編集で要求した情報を提供していません。監視するパスの 1 つが変更されるとシグナルを発しますが、名前が変更された場合、新しい名前は取得されません。そのようなイベントの受信時に現在のビューを更新/リロードするだけのファイルマネージャープログラムなどを対象としています。

それ以上の情報が必要な場合は、OS 固有の API を使用する必要があります。Qt ソースのさまざまなプラットフォームで Qt が使用するコードを確認できます。ですsrc/core/io/qfilsystemwatcher_*.[h|cpp]

Mac OS X 10.5 以降の場合、使用される基本 API はFSEventsAPI です。テクノロジーの概要ページで読むことができます。

注目すべき重要なポイントは、通知の粒度がディレクトリ レベルであるということです。ディレクトリ内の何かが変更されたことだけが通知され、何が変更されたかは通知されません。

そのため、OS レベルの API は、必要なものを直接提供しません。
古いバージョンの Mac OS X と FreeBSD の場合、Qt はkqueueAPI とEVFILT_VNODEイベント フィルターを使用します。その API は、名前が変更されたファイルの新しい名前も提供しません。

つまり、これらの API の 1 つに基づいて自分で何かをコーディングするか、それを行うライブラリを (ニーズを満たす保証付きで) 見つけるか、アプリケーションを再設計する必要があります。ポータブルな方法でディレクトリを「監視」することは、せいぜい非常にトリッキーであり、一般的に競合やエラーが発生しやすいものです。もし私があなただったら、特にあなたのデザインが「イベント」を見逃さないことを要求している場合、私は楽観的ではありません.

于 2012-05-26T08:21:47.770 に答える