FTPに似たファイル転送機能を提供するプロトコル、クライアント、およびサーバーを作成しています(他の機能の中でも特に)。私のプロトコルと FTP の違いの 1 つは、リモート サーバーのディレクトリ構造のコピーをローカル キャッシュに保存したいということです。サーバーは Windows (C++ で記述) でのみ実行されるため、該当する Win32 API 呼び出しがある場合は歓迎されます。最初に接続すると、クライアントは直接の子 (ファイルとディレクトリの両方、オプションなしの「ls」または「dir」のように) を要求し、ユーザーがディレクトリに移動すると、期待どおりに新しい親でこの手順が繰り返されます。 .
もちろん、ほとんどの場合、特定のサーバーの同じディレクトリがクライアントによって 2 回要求された場合、ディレクトリの内容は同じになります。したがって、各ディレクトリ リストの結果をクライアントにキャッシュしたいと考えています。これを実装する簡単な方法が欲しいのですが、ファイル/ディレクトリへのアクセスと変更時間と名前の変更のために有効期限が切れるキャッシュ エントリを考慮する必要があります。これは注意が必要な部分です。ファイルの内容だけでなく、サブディレクトリの内容のファイル名、データ、変更、アクセスの日付などの変更も考慮したハッシュのようなものを使用して、クライアントがほぼ瞬時にディレクトリのリストを作成できるものが理想的です。
プログラムがたまにしか実行されない場合でも、このキャッシュを維持する必要があるため、これは FileSystemWatcher (または同様の) オブジェクトに完全に依存できるものではありません。もちろん、これらはキャッシュの維持に役立ちますが、それは問題の一部にすぎません。
これまでの私の最高の (?) アイデアは、FindFirstFile() と FindNextFile() を使用し、WIN32_FIND_DATA 構造体で見つかった値を (何らかの形で) 並べ替え、連結してハッシュし (おそらくファイルの内容を含む)、それを有効期限のトークンとして使用することです (ちょうどこれらのフィールドのいずれかの変更を示します)。次に、ディレクトリごとにこれらのトークンの 1 つを保持します。ディレクトリが要求されると、サーバーはすべてをハッシュし、それをクライアントから提供されたキャッシュされたハッシュと比較し、異なる場合は通常のデータを返し、そうでない場合は HTTP 304 に相当します。このようなことを行うためのそれほど精巧でない方法はありますか? 「ディレクトリの最終更新日」は、すべての状況でサブディレクトリのファイルの変更日をすべて考慮に入れていますか? 私'
このサービスはファイル共有のためのものであるため、特定のファイルを共有している他の人を自動的かつ効率的に見つけることができるように、ハッシュを含む何かが特に優れていますが、ハッシュ計算中にディスクをホースするよりも心配はありません.
私よりもプログラミングの経験が豊富な他の人がこの問題を解決するために何をするのか疑問に思っています (rsync と subversion は同様の問題を解決しましたが、同一ではありません)。