65.9K
CodeProject 正在变化。 阅读更多。
Home

用于精益竞赛的文件比较实用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (2投票s)

2009 年 8 月 28 日

CPOL

2分钟阅读

viewsIcon

27906

downloadIcon

391

文件比较实用程序,用于参加精益竞赛。

介绍 

这是 Code Project 精益求精竞赛的参赛作品,旨在编写一个高效的文本差异比较工具。

问题描述如下:创建一个应用程序,以尽可能快的速度和尽可能少的内存使用量来计算并显示两个文本文件之间的差异。提供计时数据和最大内存使用数据,以证明您是效率最高、最精简的。

我的解决方案是用 C# 开发的,用于比较两个文件。生成的程序紧凑且非常快速,并且可以完美地扩展到任何文件大小。 

屏幕截图

这是执行此应用程序时的屏幕显示: 

这是比较两个不同文件时的页面

分析 

为了使此应用程序快速且简单,我们首先检索两个文件的位置。如果这两个文件的位置和名称相同,则我们假设这些文件的内容相同。

在第二步中,如果这两个文件的名称不同,我们首先检索这两个文件内容的长度。如果长度存在差异,则该函数返回 false,我们计算时间并给出文件不相同的消息。如果这两个文件的长度相同,则我们开始读取这两个文件,并连续比较行,只要两个文件中的行相同,我们就继续而不出现任何问题。但是,一旦出现不匹配,我们就必须决定文件 1 中的当前行是否已消失,或者文件 2 中的当前行是否已插入,或者一行已编辑为另一行。我们将在消息框中显示结果。

Using the Code

我基本上创建了一个函数 FileCompare

private bool FileCompare(string file1, string file2)
        {
            int file1byte;
            int file2byte;
            FileStream fs1;
            FileStream fs2;

            if (file1 == file2)
            {
                return true;
            }

            fs1 = new FileStream(file1, FileMode.Open);
            fs2 = new FileStream(file2, FileMode.Open);

            if (fs1.Length != fs2.Length)
            {
                fs1.Close();
                fs2.Close();

                return false;
            }

            do
            {
                file1byte = fs1.ReadByte();
                file2byte = fs2.ReadByte();
            }
            while ((file1byte == file2byte) && (file1byte != -1));

            fs1.Close();
            fs2.Close();

            return ((file1byte - file2byte) == 0);
        }

此函数将两个需要进一步比较的文件作为输入,并以布尔值(truefalse)的形式向我们提供输出。

本文中描述的示例代码执行逐字节比较,直到找到不匹配项或到达文件末尾。

该代码还执行两个简单的检查,以提高比较效率

  • 如果两个文件引用指向相同的文件,则这两个文件必须相等。
  • 如果两个文件的大小不相同,则这两个文件不相同。

关注点

此功能类似于包含在各种版本的 Microsoft Windows 和 Microsoft MS-DOS 以及某些开发工具中的基于 MS-DOS 的 Fc.exe 实用程序。

此应用程序比较两个文件所需的时间少于 10 毫秒,并且处理整个应用程序需要 40KB 的内存。

历史

  • 2009 年 8 月 28 日:初始发布
© . All rights reserved.