2012-02-21 51 views
0

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

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; 
      } 
     } 

任何建议我怎么能使它工作?

+1

就像一个不相关的代码风格的评论...嵌套使用()语句让我把我的头发,特别是当他们跨越很多的代码。 – 2012-02-21 19:12:47

+4

问题是? – Magnus 2012-02-21 19:13:28

+0

那么你需要什么?什么是你的[问题](http://stackoverflow.com/faq#questions)? – 2012-02-21 19:16:07

回答

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(); 

在这条路上,你会发现在第一个文件,但不能在第二个文件中的所有行。

+0

diffLines是一个包含不同行的数组吗? – 2012-02-21 19:25:59

+0

@Emil:'diffLines'是一个'List '(强类型ArrayList),它包含所有在第一个文件但不在第二个文件中的行(可以很容易地将其反转)。如果你想要一个字符串数组,使用'ToArray'而不是'ToList'。 – 2012-02-21 19:28:07

+1

+1,但是如果文件真的很大,他应该小心,因为它们一次加载到内存中。 – 2012-02-21 19:28:35

0

首先,如果您在使用语句中对流进行作用域范围,则不需要在流上调用.Close()。

现在的文件版本比较的部分,我觉得这个逻辑是你的问题的根源:

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

这里是错误 - 如果所有的线条都不同,但最后一行是一样的,你的“NR “将被设置为零。进一步向下检查是否(nr == 0),相反,您可能有两个变量一个用于numberOfSameLine,另一个用于numberOfDifferentLines,或者您可以用if(newLines.Count> 0)替换if逻辑 - 取决于您的应用程序逻辑。

+0

是的,我也注意到了。这似乎很奇怪。我曾假设它还有一些我可能不知道的含义 – 2012-02-21 19:29:06

0

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

你同时声明:

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

你已经达到了fileinit结束后,您的病情会停止评估为true。如果要继续添加从filewrtnewlines的行,则可以循环访问filewrt的其余部分。

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

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