0

フォルダー内のファイルをサーバーと同期する 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 はこれに対する解決策を提供しないため、自分で発明する必要がありました。

4

1 に答える 1

0

書き込みプログラムにアクセスできますか? その場合、最初にデータを一時ファイルに書き込み、書き込みが完了してから名前を変更することをお勧めします (atomicファイル システムでの操作のようなものです)。そうしないと、書き込みプログラムがファイルを長時間変更しない理由がわからないため、「変更を適切に長時間待つ」アプローチは常に失敗する可能性があります。

  • HD5 フォーマットの追加:

ファイルは、サイズを変更せずにコンテンツを変更することさえできますが次のようになります。

https://www.hdfgroup.org/HDF5/doc/H5.format.html#FileMetaDataから

ファイル整合性フラグ

この値には、ファイル内に含まれる情報の一貫性に関する情報を示すフラグが含まれています。現在、次のビット フラグが定義されています。

Bit 0 set indicates that the file is opened for write-access.
Bit 1 set indicates that the file has been verified for consistency and is guaranteed to be consistent with the format defined

このドキュメントで。ビット 2 ~ 31 は、将来の使用のために予約されています。

ビット 0 は、ファイルが書き込みアクセスのために開かれるときの最初のアクションとして設定されるべきであり、ファイルを閉じるときの最終アクションとしてのみクリアされるべきです。ビット 1 は、ファイルへの通常のアクセス中にクリアし、ファイルの一貫性がライブラリまたは一貫性ユーティリティによって保証された後にのみ設定する必要があります。

hd5 API はこれらのファイルを排他的に開くメソッドを提供し、ポーリング アプローチに加えてそれを試すと思います。

于 2015-07-18T08:34:10.797 に答える