首页 > 后端开发 > C++ > 如何比逐字节更有效地比较 .NET 中的文件?

如何比逐字节更有效地比较 .NET 中的文件?

DDD
发布: 2025-01-10 16:45:41
原创
498 人浏览过

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

.NET高效文件比较方法

在.NET中比较两个文件可能非常耗时,尤其对于大型文件而言。传统的逐字节读取二进制文件并进行比较的方法效率低下且速度慢。

替代方法

为了提高性能,请考虑以下替代方法:

文件合并方法

一种出奇快的方法是将两个文件连接到单个字节数组中,然后比较结果值。

<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>
登录后复制

校验和比较

另一种方法是使用校验和算法(例如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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板