2012-02-21 3 views
0

WinForms에서 두 파일의 내용을 비교하고 싶습니다. 모든 파일은 각 행에 이름과 번호가있는 행을 포함합니다. 첫 번째 파일을 읽고 두 번째 파일과 비교하고 싶습니다. 라인이 같지 않으면 나는 그것을 추출하여 ArrayList에 추가하려고합니다. 지금까지 내가 한 일들을보세요 :C에서 두 파일의 내용 비교 #

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

관련없는 코드 스타일 주석과 같이 중첩 된() 문을 사용하면 내 머리카락을 찢어지게 만들 수 있습니다. –

+4

그리고 질문은 무엇입니까? – Magnus

+0

그래서 무엇이 필요합니까? 당신의 질문은 무엇입니까 (http://stackoverflow.com/faq#questions)? –

답변

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

diffLine은 다른 행을 포함하는 배열입니까? –

+0

@Emil :'diffLines'은 두 번째 파일에는 없지만 쉽게 뒤집을 수있는 모든 행을 포함하는'List '(강력한 유형 ArrayList)입니다. String-Array를 원한다면, ToList 대신에 ToArray를 사용하십시오. –

+1

깨끗한 의미의 시맨틱 코드는 +1하지만, 파일을 정말 크다면 한꺼번에 불러올 수 있으므로 조심해야합니다. –

0

먼저 using 문에서 해당 스트림의 범위를 지정하려면 스트림에서 .Close()를 호출 할 필요가 없습니다.

지금 일부 diffing의 파일에 대해,이 논리가 문제의 원인이라고 생각 : 여기

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

는 버그가 - 모든 라인은 다르지만 마지막 줄은, 당신의 "NR 동일한 경우 "는 0으로 설정됩니다. 그리고 더 내려간 경우 (nr == 0), 대신 numberOfSameLine과 numOfDifferentLines에 대해 두 개의 변수를 가질 수 있습니다. if 로직을 if (newLines.Count> 0)로 대체 할 수 있습니다 - 앱 로직에 따라 다릅니다.

+0

그래, 나도 알아 챘다. 기괴한 것 같았다. 나는 그것이 내가 알지 못했을 수도있는 다른 의미가 있다고 생각했다. –

0

댓글 스레드를 읽은 후, 나는 당신이 찾고있는 것을 알고 있다고 생각합니다.

당신은 문 동안 위치 :

당신이 fileinit의 끝에 도달 한 후에
while ((linieinit = fileinit.ReadLine()) != null && (liniewrt = filewrt.ReadLine()) != null) 
{ 

, 당신의 조건이 true로 평가 중지됩니다. filewrt에서 newlines까지 계속해서 줄을 추가하려면 파일의 나머지 부분을 반복하면됩니다.

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

당신은 당신이 여부 nr++ 라인을 유지할지 여부에 대한 자신의 결정을 내릴 수 있습니다.