フォルダー内のファイルをサーバーと同期する GUI プログラムを作成しています。これらのファイルについて私が知っている情報は、これらのファイルは常に書き込まれ、削除されないということです。私の懸念は、ファイルの書き込み中にファイルのアップロードを開始することです。これを回避するために、私は問題を解決する方法を発明しました。これが間違っているかどうかを教えてくれる専門家が必要です。
だから私がやっていることは、タイマー付きのイベントループがあるということです。このタイマーが作動するたびに、新しいファイルが追加されているかどうかが調べられます。新しいファイルが見つかった場合は、次の単純な関数を使用してファイル サイズを取得します。
std::size_t GetFileSize(const std::string &filename)
{
std::ifstream file(filename.c_str(), std::ios::binary | std::ios::ate);
return file.tellg();
}
次に、新しいファイル名、サイズをフォームのデータ構造に保存します (std::
次の行に 5 つ書かれているため、視覚的にわかりやすくするために無視します)。
deque<pair<string, pair<size_t, long> > fileMonitor;
(可能であれば、より良いデータ構造を提案してください。unordered_multimap
同様の仕事をしているようです)。
したがって、これはファイル名(その文字列内)、そのサイズ(その size_t 内)、およびファイルのサイズが変更なしでチェックされた回数を保存しますchecks
。そのため、タイマーが作動するたびに、新しいファイルを探し、ファイルのサイズfileMonitor
が変更されたかどうかを確認します。単一のファイルの場合、ファイル サイズが以前と異なるchecks = 1
場合は 、ファイル サイズが同じ場合はchecks++
.
ここで、各反復で、タイマーがinterval*checks > timeout
. ファイルが十分な時間変更されていないかどうかを確認します。これにより、ファイルが安定しており、更新されていないと判断できます。
明らかな質問: のようなものを使用しないのはなぜinotify
ですか? アップロードするファイルの動作をすでに知っているので、クロスプラットフォームで構造がシンプルなものが必要だからです。残念ながら、boost はこれに対する解決策を提供しないため、自分で発明する必要がありました。