2011-11-23 3 views
5

내 응용 프로그램에서 데이터를 가져와 텍스트 파일에 추가하지만 프로그래밍 방식으로 텍스트 파일의 첫 줄을보고 다음과 일치하는지 확인해야합니다 텍스트 :텍스트 파일의 맨 위에 한 줄 추가

원하는

날짜 시간, VirtualIP, VirtualPort, VirtualName,의 DestinationIP, DestPort, 상태,

첫 번째 줄이없는 경우는, 정상적인 기능 (아래 스 니펫) 일을 계속 않는 경우 위와 동일하다. 나는 거기에 현재 겹쳐 쓰지 않고 첫 줄에 위의 것을 삽입하고 싶다. 어떻게해야합니까? (본질적으로 모든 것을 한 줄씩 밀어 내서 첫 줄에 원하는 것을 추가 할 수 있습니다 ...) btw 이것은 Excel에서 열 수있는 CSV 파일로 저장됩니다.

try 
{ 
    // ... 
    for (int j = 0; j < memberStatus.Result.Count; j++) 
    { 
     VirtualMemberStatus status = memberStatus.Result[j]; 

     //text += String.Format("Name: {4}, Member: {0}:{1}, Status: {2}, Desired: {3}" + Environment.NewLine, status.Member.Address, status.Member.Port, status.EffectiveStatus, status.DesiredStatus, virtualKey.Key); 
     text += String.Format("{5},{4},{0},{1},{2},{3}" + Environment.NewLine, status.Member.Address, status.Member.Port, status.EffectiveStatus, status.DesiredStatus, virtualKey.Key.Replace(":", ","), DateTime.UtcNow); 
    } 
} 
catch 
{ 
    //ERROR CODE 2 
    //MessageBox.Show("Error occurred, check device name (case senstive) and admin group. This error may also occur due to connection loss, try again."); 
    errors += String.Format("{0} Error Code: 2, Error occurred, check device name (case senstive) and admin group. This error may also occur due to connection loss, try again." + Environment.NewLine, DateTime.UtcNow); 

} 

this.resultsTextBox.Text = text; 

이 파일은 많이 삭제되지는 않지만 그 파일의 맨 위에 올바른 열 이름을 지정하고 싶을 때 사용하십시오. 예 :

DateTime,VirtualIP,VirtualPort,VirtualName,DestinationIP,DestPort,Status,Desired 
+1

제목 끝에 "C#"이 정말로 필요하지 않습니다. 태그는 당신을 위해 그것을합니다. –

+0

그래, 나도 알아하지만 더 나은 가시성을 위해 그것을했다 – KPS

+0

태그는 당신을 위해 그것을 돌봐. 당신이하는 일은 당신의 책을 읽기가 더 어렵게 만드는 것입니다. 따라서 다른 사람들이 책을 읽고 도와 줄 가능성은 희박합니다. 이것은 뉴스 그룹이나 토론 포럼이 아닙니다. –

답변

8

전체 파일을 다시 작성해야합니다.

  1. 는 새로운 (임시을!) 열
  2. 높이와 가까운 출력 파일
  3. (성능이 필요한 경우 블록 버퍼링을 고려) 라인을 작성, 각 입력 라인
  4. 쓰기 헤더 행
  5. 파일
  6. 오류가없는 경우 임시 파일을 적절한 위치로 옮깁니다 (이름을 변경하여).

(IO) 오류가 여기에

그런 일 할 수있는 코드 과정을 중간에있을 때 문제를 방지 할 수 있습니다이 절차 : 샘플 코드도를 생성하는

using (var input = new StreamReader("input.txt")) 
    using (var output = new StreamWriter("input.txt.temp")) 
{ 
    output.WriteLine("headerline"); // replace with your header :) 

    var buf = new char[4096]; 
    int read = 0; 
    do 
    { 
     read = input.ReadBlock(buf, 0, buf.Length); 
     output.Write(buf, 0, read); 
    } while (read > 0); 

    output.Flush(); 
    output.Close(); 
    input.Close(); 
} 

File.Replace("input.txt.temp", "input.txt", "input.txt.backup"); 

주 지원. 한 가지 가능한 점은 FileStream(...., FileMode.CreateNew)을 명시 적으로 인스턴스화하여 해당 이름으로 파일이 이미 존재하는 경우 임시 파일을 덮어 쓰지 않도록하는 것입니다.

또 다른 해결책은 System.IO.Path.GetTempFileName()을 사용하는 것입니다. 그러나 File.Replace은 더 이상 유효하지 않을 수 있습니다. 임시 파일은 다른 볼륨/파일 시스템에있을 수 있기 때문입니다.

+0

코드 샘플을 추가했습니다 – sehe

+0

이 작동하지만 도구를 다시 실행할 때 맨 위에 줄을 다시 삽입합니다. 나는 오직 한 번만 원한다. 헤더가 일치하면이 프로세스를 건너 뛰고 어떻게 0 행을 찾고 읽을 수 있을까? – KPS

+0

이것은 나를 위해 일했습니다. 첫 번째 줄이 내 머리글과 일치하는지 여부를 확인하기 위해 if/else 문을 수행했습니다. 고맙습니다! – KPS

0

당신이 찾고있는 단어를 찾아야하는지 첫 번째 위치로 검색해야합니다.이 코드 조각은 찾고있는 것을 얻을 수 있습니다.

Dim filePath As String = "file.txt" 
    Dim bufferSize As Integer = 8129 

    Dim textToMatch As String = "DateTime,VirtualIP,VirtualPort,VirtualName,DestinationIP,DestPort,Status,Desired" 
    Dim textByte As Byte() = ASCIIEncoding.ASCII.GetBytes(text) 

    Dim buffer As Byte() = Nothing 

    Dim fs As FileStream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite) 
    fs.Read(buffer, 0, bufferSize) 


    Dim i As Int32 = fs.Seek(0, SeekOrigin.Begin) 
    fs.Position = i 

    If fs.Position.Equals(textToMatch) Then 

    Else 
     fs.Write(textByte, 0, textByte.Length) 
    End If 

    fs.Flush() 
    fs.Close() 
관련 문제