比较c#中2个文件的内容

时间:2012-02-21 19:10:25

标签: c# winforms file compare

我想比较WinForms中两个文件的内容。每个文件都包含每行上带有名称和编号的行。我想从第一个文件中读取并与第二个文件进行比较。如果该行不相等,我想提取它并将其添加到ArrayList。看看到目前为止我做了什么:

  Int32 nr = 0;
        String linieinit=" ", liniewrt=" ";
        ArrayList newlines = new ArrayList();
        using (StreamReader fileinit = new StreamReader(Application.StartupPath + "/bontemp" + label_pin.Tag.ToString() + "initial"))
        {
            using (StreamReader filewrt = new StreamReader(Application.StartupPath + "/bontemp" + label_pin.Tag.ToString()))
            {
                while ( (linieinit = fileinit.ReadLine()) != null && (liniewrt = filewrt.ReadLine()) != null)
                {
                    Console.WriteLine(linieinit + "      " + liniewrt);
                    if (linieinit.Equals(liniewrt))
                    {
                        nr = 0;
                    }
                    else
                    {
                        nr++;
                        newlines.Add(liniewrt);
                    }
                }
                filewrt.Close();
                File.Delete(Application.StartupPath + "/bontemp" + label_pin.Tag.ToString());
            }
            fileinit.Close();
            File.Delete(Application.StartupPath + "/bontemp" + label_pin.Tag.ToString() + "initial");

        }
        Console.WriteLine(nr);
        if (nr == 0)
        {
            int pozition = 0;
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                e.Graphics.DrawString(dataGridView1.Rows[i].Cells["DenumireProdus"].Value.ToString(), print6B, Brushes.Black, x, 130 + height);
                e.Graphics.DrawString(dataGridView1.Rows[i].Cells["produs_cantitate"].Value.ToString(), print6B, Brushes.Black, x + 110, 130 + height);
                height += 15;
            }
            if (pozition > height)
            {
                pozition = height;
            }
        }
        else
        {
            for (Int32 j = 0; j < newlines.Count; j++)
            {
                e.Graphics.DrawString(newlines[j].ToString(), print6B, Brushes.Black, x, 130 + height);
                height += 15;
            }
        }

有任何建议我怎么能让它发挥作用?

3 个答案:

答案 0 :(得分:4)

您可以使用LINQ将两个文件相互比较:

var f1Lines = File.ReadAllLines(f1Path);
var f2Lines = File.ReadAllLines(f2Path);
var diffLines = f1Lines
     .Where ((line, index) => index >= f2Lines.Length || line != f2Lines[ index ])
     .Select((line, index) => line).ToList();

通过这种方式,您可以找到第一个文件中但不在第二个文件中的所有行。

答案 1 :(得分:0)

首先,如果要在using语句中确定该流,则不需要在流上调用.Close()。

现在对于文件差异部分,我认为这个逻辑是你问题的根源:

if (linieinit.Equals(liniewrt)) 
{ 
    nr = 0; 
} 
else 
{ 
    nr++; 
    newlines.Add(liniewrt); 
} 

这是错误 - 如果所有行都不同但最后一行相同,则“nr”将设置为零。更进一步,你检查是否(nr == 0),而你可能有两个变量,一个用于numberOfSameLine,另一个用于numberOfDifferentLines,或者你可以用if替换if逻辑(newLines.Count&gt; 0) - 取决于你的app逻辑。

答案 2 :(得分:0)

在阅读评论主题后,我想我知道你在寻找什么。

你在发表声明:

while ( (linieinit = fileinit.ReadLine()) != null && (liniewrt = filewrt.ReadLine()) != null)
{

到达fileinit结束后,您的情况将停止评估为真。如果您想继续添加从filewrtnewlines的行,您可以循环浏览filewrt的其余部分。

nr++;
newlines.Add(liniewrt);
while((liniewrt = filewrt.ReadLine()) != null)
{
    nr++;
    newlines.Add(liniewrt);
}

您可以自行决定是否要保留nr++行。