2011-11-23 71 views
5

Ứng dụng của tôi lấy dữ liệu và nối nó vào tệp văn bản nhưng tôi cần tìm hiểu cách tôi có thể xem dòng đầu tiên của tệp văn bản và xem nó có khớp với văn bản:Thêm một dòng vào đầu tệp văn bản

DateTime, VirtualIP, VirtualPort, VirtualName, DestinationIP, DestPort, Status, mong muốn

Nếu nó sau đó tiếp tục làm các chức năng bình thường (đoạn dưới đây), nếu dòng đầu tiên không phải là giống như ở trên thì tôi muốn chèn phần trên vào dòng đầu tiên mà không ghi đè những gì hiện có ở đó. Tôi có thể làm cái này như thế nào? (về cơ bản đẩy tất cả mọi thứ xuống một dòng để tôi có thể thêm những gì tôi muốn trên dòng đầu tiên) ... btw này đang được lưu dưới dạng tệp csv có thể được mở bằng excel.

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; 

Tệp này không bị xóa nhiều nhưng trong trường hợp tôi muốn nó có tên cột chính xác ở trên cùng. tức là:

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

Bạn thực sự không cần "C#" ở cuối tiêu đề của mình. Các thẻ làm điều đó cho bạn. –

+0

Vâng tôi biết nhưng tôi đã làm nó cho khả năng hiển thị tốt hơn – KPS

+0

các thẻ chăm sóc đó cho bạn. Tất cả những gì bạn đang làm là làm cho tiêu đề của bạn khó đọc hơn, vì vậy ít có khả năng người khác sẽ đọc nó và giúp bạn. Đây không phải là một diễn đàn thảo luận hay nhóm tin tức. –

Trả lời

8

Bạn cần phải viết lại toàn bộ tệp.

  1. mở mới (tạm thời!) Nộp
  2. ghi tiêu đề dòng
  3. cho mỗi dòng đầu vào, viết dòng (xem xét khối đệm nếu hiệu suất là một mối quan tâm)
  4. tuôn ra và đầu ra gần tập tin
  5. CHỈ nếu không có lỗi, hãy di chuyển tệp tạm thời tại chỗ (bằng cách đổi tên).

Thủ tục này có thể ngăn ngừa các vấn đề khi có một (IO) lỗi nửa chừng quá trình

Đây là mã để làm một điều như vậy:

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"); 

Lưu ý rằng mã mẫu thậm chí tạo ra một sao lưu. Một điểm cải tiến có thể là để khởi tạo rõ ràng FileStream(...., FileMode.CreateNew) để tránh ghi đè tệp tạm thời nếu tệp đã tồn tại bằng tên đó.

Một giải pháp khác có thể là sử dụng System.IO.Path.GetTempFileName(). Tuy nhiên, sau đó File.Replace có thể không còn hiệu quả và nguyên tử nữa, vì tempfolder có thể nằm trên một hệ thống tập tin/khối lượng khác.

+0

thêm mã mẫu – sehe

+0

Điều này làm việc nhưng khi tôi chạy lại công cụ, nó sẽ chèn lại dòng ở trên cùng. Tôi chỉ muốn nó một lần, làm thế nào tôi có thể tìm kiếm dòng 0, đọc nó, nếu nó phù hợp với tiêu đề sau đó bỏ qua quá trình này? – KPS

+0

Điều này làm việc cho tôi, tôi chỉ làm một câu lệnh if/else để xác minh xem dòng đầu tiên có khớp với tiêu đề của tôi hay không. Cảm ơn bạn! – KPS

0

bạn cần phải tìm kiếm vị trí đầu tiên để xem liệu nó có toán các từ đó hay không, đoạn mã này có thể đạt được những gì bạn đang tìm kiếm.

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() 
Các vấn đề liên quan