2

2 つのファイルを比較して、まったく同じかどうかを判断する方法を知りたいです。ファイル名、作成日/変更日、必要に応じてハッシュを比較する方法を知っています。

ただし、ファイルのメタデータを比較する方法がわかりません(実際にはどのように保存されているかわかりません):セキュリティ構成、互換性設定、潜在的なウイルス対策タイムスタンプなど。

私の最終的な目標は、別々のコンピューター上の 2 つのファイル システムを詳細に比較することです。

ありがとうスティーブ

[編集] 明確にするために、質問のタイトルを再構成します

4

3 に答える 3

2

ファイルを構成するものは何ですか?最新のファイルシステム(NTFSなど)では、

  • ファイル属性(時間、FAT属性)
  • 名前のないファイルストリーム
  • 0個以上の代替データストリーム(ADS)
  • 拡張属性
  • NTFSセキュリティ(ADSに保存されていますが、個別に識別できます)

残り(構成、ウイルス対策タイムスタンプ/これは何ですか/など)はファイルの外部に保存され、ファイルではありません。

したがって、ファイルの上記のビットを確認して比較する必要があります。

さまざまな情報を読み取るためのさまざまな方法が存在し、それらすべてを使用してすべてをまとめ、さまざまなファイルと比較する必要があります。

于 2011-02-01T14:56:38.390 に答える
1

System.IO.File のすべてのゲッターを処理するだけです。

GetAccessControl
GetAttributes
GetCreationTime
...
ReadAllBytes

「同じファイル」の定義が依存するものが他にある場合 (異なるマシン上の絶対パスなど)、それも取得しますが、それが何であるかを明確にしていません。

于 2011-02-01T14:58:23.383 に答える
0

MD5、SHA で両方のファイルをハッシュし、両方の合計が同じかどうかを比較する必要があります。

System.Security.Cryptography で MD5CryptoServiceProvider と SHA512CryptoServiceProvider を確認します。

それは次のようなものです:

private string ComputeHashAsText(byte[] fileBytes)
{
    using (SHA512CryptoServiceProvider cryptoService = new SHA512CryptoServiceProvider())
    {
        return Encoding.ASCII.GetString(cryptoService.ComputeHash(fileBytes));
    }
}

public bool CompareFiles(string pathA, string pathB)
{
    string hashPathA = ComputeHashAsText(File.ReadAllBytes(pathA));
    string hashPathB = ComputeHashAsText(File.ReadAllBytes(pathB));

    return hashPathA == hashPathB;
}

実際のソリューションでは、比較するファイルが大きすぎてすべてのバイトをメモリに読み取ってハッシュすることができないため、チャンクなどでハッシュを計算することができます。

于 2011-02-01T14:52:07.463 に答える