Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Membandingkan Fail dalam .NET Dengan Lebih Cekap Daripada Byte-by-Byte?

Bagaimanakah Saya Boleh Membandingkan Fail dalam .NET Dengan Lebih Cekap Daripada Byte-by-Byte?

DDD
DDDasal
2025-01-10 16:45:41499semak imbas

How Can I Compare Files in .NET More Efficiently Than Byte-by-Byte?

Kaedah perbandingan fail yang cekap .NET

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 penggabungan fail

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>

Perbandingan checksum

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn