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
Lepaskan: 2025-01-10 16:45:41
asal
511 orang telah melayarinya

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.

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;
}
Salin selepas log masuk

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.

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;
}
Salin selepas log masuk

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 Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan