2017-12-20 21 views
0

ディレクトリが80個あり、ディレクトリのチェックサムをチェックしたいと思います。ディレクトリチェックサム

ディレクトリの内容が最新バージョンと一致していることを確認したいと思います。

私はリアルタイムシステムで作業していますので、効率的である必要があります。

ファイルチェックサム機能が見つかりました。

質問:すべてのファイルをループせずにディレクトリにチェックサムを実行できますか?

+2

"私の質問はすべてのファイルをループせずにディレクトリにchacksumできますか?"それはあなたが "ディレクトリのチェックサム"の意味に依存します – Slava

+0

実行時にディレクトリを読み込み、その内容が有効であることを確認します。 – LIOR

+1

各ファイルの内容を検証する必要がありますか?はいの場合、各ファイルのチェックサムを計算する必要があります。 – Slava

答えて

2

可能な解決策の1つは、ファイルが変更されたときに各ファイルの日時とハッシュを変更して更新する特別な(非表示の)ファイルを維持することです。次に、そのファイルのハッシュをディレクトリのハッシュとして取得します。これにより、すべてのファイルのチェックサムを計算することはできませんが、ファイルが変更されたときの作業量は減ります。 dirのスナップショットを作成する必要がある場合、選択肢はありませんが、すべてのファイルを特定の順序でチェックサムする必要があります。

注:偽造できないという厳しい要件がない限り、暗号ハッシュを避けることを検討することがあります。暗号ハッシュは、むしろ遅く、非効率的であり、それは目的上のものです。

0

私はあなたのアプリケーションを特定していません。 md5チェックサムは一般に、精度がスピードよりも優先される状況で使用されます(または不正なプレイに対する追加のバリアを提示するため)。

速度がキングであるビルドシステムでは、ファイルの日付を記入することが一般的に使用されます。たとえば、最新のディレクトリを与えられます。filesystem::path foo、問題のディレクトリは次のとおりです。filesystem::path barあなたは、単に評価することができます:

equal(filesystem::directory_iterator(foo), filesystem::directory_iterator(), filesystem::directory_iterator(bar), filesystem::directory_iterator(), [](const auto& lhs, const auto& rhs) { return filesystem::last_write_time(lhs) == filesystem::last_write_time(rhs); }) 

Live Example

このワンライナーについての注意事項:

  1. この再帰関数ではなく、すぐに日付を評価していますfoobar
  2. あるディレクトリでの作業、これは私が手動で1を更新した場合は、1つのライナーはまだ肯定的に応答します<にラムダで==を変更することができ、MD5チェックサムを超える多大な利点があり、たとえば、ビルドシステムでVisual Studio's implementation of last_write_time seems to have an issue with directories
  3. 新しいテスト版へのファイルの転送