C# 比较c语言中两个文件的内容#
我想比较WinForms中两个文件的内容。每个文件都包含每行带有名称和数字的行。我想从第一个文件中读取数据,并将其与第二个文件进行比较。如果行不相等,我想提取它并将其添加到ArrayList中。看看我到目前为止做了什么: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
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读取所有文件!这应该很简单。阅读