サーバーとクライアントの間でファイルを転送できるサーバークライアントQTプロジェクトに取り組んでいます。GUI プロジェクトなので、サーバーのファイル システムをファイル エクスプローラーのようにクライアント プログラムに表示したいと考えています。
問題は、QFileSystemModel または QFileSystemWatcher をサーバーからクライアントに送信する方法、またはクライアント側でサーバーのシステム ファイルを表示する方法はありますか? ありがとうございました。
サーバーとクライアントの間でファイルを転送できるサーバークライアントQTプロジェクトに取り組んでいます。GUI プロジェクトなので、サーバーのファイル システムをファイル エクスプローラーのようにクライアント プログラムに表示したいと考えています。
問題は、QFileSystemModel または QFileSystemWatcher をサーバーからクライアントに送信する方法、またはクライアント側でサーバーのシステム ファイルを表示する方法はありますか? ありがとうございました。
QDataStream の使用がモデル クラスで機能するかどうかを試すことができます。本当に良い例はここにあります:
この問題に取り組む最善の方法は、オブジェクトのシリアル化手法を実装することです。それが完了したら、そのようなシリアル化されたオブジェクトを通信プロトコル レベルで交換するためのルールを実装する必要があります。
たとえば、次のようにパスをシリアル化できます。
file size - 8bytes; path flags - 1byte; path size - 2bytes; actual path - `path size` bytes;
ファイル サイズ フィールドには、パスが指すファイルのサイズを保存し、フラグ フィールドには、ファイルに関する追加情報を保存します (たとえば、ディレクトリ/ファイルなどの場合)。パスの実際のパス フィールドでは、(明らかに) パスです。
たとえば、フラグ フィールドにビット 0 を設定して、ファイルとディレクトリを区別したいとします。ファイルの場合は 1、ディレクトリの場合は 0 です。「/abc/d/efg」などの 512MB のファイルを保持するディレクトリ パスは、次のようにシリアル化されます (|
フィールド区切り記号として使用)。
536870912 | 0 | 10 | /abc/d/efg
ディレクトリ ツリーをシリアル化するには、そこにあるすべてのファイルをシリアル化し、バイトをベクトルに格納します。ベクターをシリアル化するには、含まれるファイルの数を指定するプレフィックス (4 バイトなど) を追加するだけです。たとえば、次の形式のストリーム:
2 | (536870912 | 0 | 10 | /abc/d/efg), (536870912 | 0 | 10 | /abc/d/efh)
両方のサイズが 512MB の 2 つのファイル パス エントリがあり、両方のディレクトリに name があり、もう 1 つが name であることがわかり/abc/d/efg/
ます/abc/d/efh
。
これで、ディレクトリ ツリーをシリアライズ/デシリアライズする方法がわかりました。相手に送信するには、最初にシリアル化されたオブジェクトに一意のメッセージ ID タイプのプレフィックスを付けて (相手が受信内容を認識できるようにするため)、それを送信します。
0x00
したがって、最終的に、上記の 2 つのエントリが与えられた場合、このタイプのシリアル化されたオブジェクトの前に最終的なストリームを付けると、次のようになります。
0 | 2 | (536870912 | 0 | 10 | /abc/d/efg), (536870912 | 0 | 10 | /abc/d/efh)