C# 比较c语言中两个文件的内容#

C# 比较c语言中两个文件的内容#,c#,winforms,file,compare,C#,Winforms,File,Compare,我想比较WinForms中两个文件的内容。每个文件都包含每行带有名称和数字的行。我想从第一个文件中读取数据,并将其与第二个文件进行比较。如果行不相等,我想提取它并将其添加到ArrayList中。看看我到目前为止做了什么: Int32 nr = 0; String linieinit=" ", liniewrt=" "; ArrayList newlines = new ArrayList(); using (StreamReader filei

我想比较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;
            }
        }
Int32 nr=0;
字符串linieinit=“”,liniewrt=“”;
ArrayList换行符=新的ArrayList();
使用(StreamReader fileinit=new StreamReader(Application.StartupPath+“/bontemp”+label_pin.Tag.ToString()+“initial”))
{
使用(StreamReader filewrt=new StreamReader(Application.StartupPath+“/bontemp”+label_pin.Tag.ToString())
{
而((linieinit=fileinit.ReadLine())!=null&(liniewrt=filewrt.ReadLine())!=null)
{
Console.WriteLine(LINEInit+“”+liniewrt);
如果(线性单位等于(线性单位))
{
nr=0;
}
其他的
{
nr++;
换行。添加(liniewrt);
}
}
filewrt.Close();
Delete(Application.StartupPath+“/bontemp”+label_pin.Tag.ToString());
}
fileinit.Close();
文件.Delete(Application.StartupPath+“/bontemp”+label_pin.Tag.ToString()+“initial”);
}
控制台写入线(nr);
如果(nr==0)
{
int-pozition=0;
对于(int i=0;i高度)
{
pozition=高度;
}
}
其他的
{
对于(Int32 j=0;j

有什么建议吗?

您可以使用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();

这样,您可以找到第一个文件中的所有行,但不在第二个文件中。

您可以使用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();

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

首先,如果您在using语句中对某个流进行范围限定,则无需对该流调用.Close()

现在对于文件扩散部分,我认为这一逻辑是问题的根源:

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

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

首先,您不需要调用.Close()如果要在using语句中限定流的作用域,则在流上

现在对于文件扩散部分,我认为这一逻辑是问题的根源:

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

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

阅读评论线索后,我想我知道您在寻找什么

您的while声明:

while ( (linieinit = fileinit.ReadLine()) != null && (liniewrt = filewrt.ReadLine()) != null)
{
到达
fileinit
末尾后,您的条件将停止计算为true。如果要继续将
filewrt
中的行添加到
newlines
,只需循环执行filewrt的其余部分即可

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

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

看完评论后,我想我知道你在找什么了

您的while声明:

while ( (linieinit = fileinit.ReadLine()) != null && (liniewrt = filewrt.ReadLine()) != null)
{
到达
fileinit
末尾后,您的条件将停止计算为true。如果要继续将
filewrt
中的行添加到
newlines
,只需循环执行filewrt的其余部分即可

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

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

就像不相关的代码样式注释一样。。。嵌套的using()语句让我毛骨悚然,特别是当它们跨越大量代码时。那么您需要什么呢?到目前为止,您的代码似乎满足您的用例。它还做了很多额外的事情。你有什么错误吗?你到底在问什么?我没有收到任何错误,但似乎没有从filewrt读取所有文件!这应该很简单。从每个文件中一次读取一行。将行转换为字符串。使用String.Equals方法比较字符串A和字符串B。如果它们不是相同的字符串,则将其添加到集合中。这最多需要10行代码。请不要在读取文件B的同时读取文件A…。这将不会得到您想要的结果。就像不相关的代码样式注释一样。。。嵌套的using()语句让我毛骨悚然,特别是当它们跨越大量代码时。那么您需要什么呢?到目前为止,您的代码似乎满足您的用例。它还做了很多额外的事情。你有什么错误吗?你到底在问什么?我没有收到任何错误,但似乎没有从filewrt读取所有文件!这应该很简单。阅读