.NET で 2 つのファイルを比較すると、特に大きなファイルの場合、非常に時間がかかることがあります。バイナリ ファイルをバイトごとに読み取って比較する従来の方法は、非効率的で時間がかかります。
代替方法
パフォーマンスを向上させるには、次の代替案を検討してください:
驚くほど高速な方法は、2 つのファイルを 1 バイトの配列に連結し、結果の値を比較することです。
<code class="language-csharp">const int BYTES_TO_READ = sizeof(Int64); static bool FilesAreEqual(FileInfo first, FileInfo second) { if (first.Length != second.Length) return false; if (string.Equals(first.FullName, second.FullName, StringComparison.OrdinalIgnoreCase)) return true; int iterations = (int)Math.Ceiling((double)first.Length / BYTES_TO_READ); using (FileStream fs1 = first.OpenRead()) using (FileStream fs2 = second.OpenRead()) { byte[] one = new byte[BYTES_TO_READ]; byte[] two = new byte[BYTES_TO_READ]; for (int i = 0; i < iterations; i++) { fs1.Read(one, 0, BYTES_TO_READ); fs2.Read(two, 0, BYTES_TO_READ); if (!one.SequenceEqual(two)) return false; } } return true; }</code>
もう 1 つの方法は、CRC や MD5 などのチェックサム アルゴリズムを使用して各ファイルのフィンガープリントを生成することです。これらのフィンガープリントの比較は、ファイル全体を比較するよりもはるかに高速です。
<code class="language-csharp">static bool FilesAreEqual_Hash(FileInfo first, FileInfo second) { byte[] firstHash = MD5.Create().ComputeHash(first.OpenRead()); byte[] secondHash = MD5.Create().ComputeHash(second.OpenRead()); for (int i = 0; i < firstHash.Length; i++) { if (firstHash[i] != secondHash[i]) return false; } return true; }</code>
パフォーマンスの比較
大きなビデオ ファイルのテストでは、ファイル結合方式のパフォーマンスはバイト単位の比較方式の約 3 倍でしたが、ハッシュ比較の方が高速で、平均約 865 ミリ秒でした。
最適な方法は、比較するファイルのサイズと性質によって異なります。ただし、これらの代替方法では、従来のバイトごとの比較方法に比べてパフォーマンスが大幅に向上します。
以上が.NET でファイルをバイトごとより効率的に比較するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。