2011-11-23 88 views
5

我的應用程序將數據提取並附加到文本文件,但我需要了解如何以編程方式查看文本文件的第一行並查看它是否與以下內容匹配文本:將單行添加到文本文件的頂部

日期時間,VirtualIP,VirtualPort,VirtualName,DestinationIP,DestPort,狀態,期望

如果它不然後繼續做正常功能(如下片斷),如果第一行是不是與上面相同,那麼我想在第一行插入上面的內容而不覆蓋當前存在的內容。我怎樣才能做到這一點? (基本上是把所有內容都推到一行,這樣我就可以在第一行添加我想要的內容)......順便說一句,這是保存爲可以在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. 只有在沒有錯誤的情況下,臨時移動文件(通過重命名)。

此過程可以防止出現問題時,有半山腰的(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

你需要搜索到的第一個位置,看看它是否mathches這些單詞,這段代碼可以實現你正在尋找的東西。

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() 
相關問題