在文本文件的顶部添加一行

时间:2011-11-23 00:27:32

标签: c# .net csv formatting

我的应用程序提取数据并将其附加到文本文件,但我需要了解如何以编程方式查看文本文件的第一行,看它是否与以下文本匹配:

  

日期时间,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

2 个答案:

答案 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可能不再具有效率和原子性,因为tempfolder可能位于另一个卷/文件系统上。

答案 1 :(得分: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()