Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Membandingkan Fail dalam .NET Dengan Lebih Cekap Daripada Byte-by-Byte?
Membandingkan dua fail dalam .NET boleh memakan masa yang lama, terutamanya untuk fail besar. Kaedah tradisional membaca fail binari bait demi bait dan membandingkannya adalah tidak cekap dan perlahan.
Kaedah alternatif
Untuk meningkatkan prestasi, pertimbangkan alternatif berikut:
Kaedah yang sangat pantas ialah menggabungkan dua fail ke dalam tatasusunan bait tunggal dan membandingkan nilai yang terhasil.
<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>
Kaedah lain ialah menjana cap jari setiap fail menggunakan algoritma checksum seperti CRC atau MD5. Membandingkan cap jari ini adalah lebih pantas daripada membandingkan keseluruhan fail.
<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>
Perbandingan prestasi
Dalam ujian fail video yang besar, prestasi kaedah penggabungan fail adalah lebih kurang 3 kali ganda berbanding kaedah perbandingan bait demi bait, manakala perbandingan cincang adalah lebih pantas, dengan purata kira-kira 865 milisaat.
Kaedah terbaik bergantung pada saiz dan sifat fail yang ingin anda bandingkan. Walau bagaimanapun, alternatif ini memberikan peningkatan prestasi yang ketara berbanding kaedah perbandingan bait demi bait tradisional.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membandingkan Fail dalam .NET Dengan Lebih Cekap Daripada Byte-by-Byte?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!