Сравните содержимое 2 файлов в c # - PullRequest
0 голосов
/ 21 февраля 2012

Я хочу сравнить содержимое двух файлов в 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 ]

4 голосов
/ 21 февраля 2012

Вы можете использовать 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 голосов
/ 21 февраля 2012

Прочитав ветку комментариев, думаю, я знаю, что вы ищете.

Вы в то время как заявление:

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++ или нет.

0 голосов
/ 21 февраля 2012

Прежде всего вам не нужно вызывать .Close () в потоке, если вы определяете этот поток в операторе using.

Теперь для части различий в файлах, я думаю, что эта логика является источникомвашей проблемы:

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

Вот ошибка - Если все строки разные, но последняя строка одинакова, ваш "nr" будет установлен в ноль.И далее вы проверяете, если (nr == 0), вместо этого у вас может быть две переменные, одна для numberOfSameLine и другая для numberOfDifferentLines, или вы можете заменить логику if на if (newLines.Count> 0) - зависит от логики вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...