我想比较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;
}
}
有任何建议我怎么能让它发挥作用?
答案 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
结束后,您的情况将停止评估为真。如果您想继续添加从filewrt
到newlines
的行,您可以循环浏览filewrt的其余部分。
nr++;
newlines.Add(liniewrt);
while((liniewrt = filewrt.ReadLine()) != null)
{
nr++;
newlines.Add(liniewrt);
}
您可以自行决定是否要保留nr++
行。