c# - 在文本文件的顶部添加一行

标签 c# .net csv formatting

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

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

如果确实如此,则继续执行正常功能(下面的片段),如果第一行与上面不同,那么我想在第一行中插入上面的内容而不覆盖当前的内容。我怎样才能做到这一点? (基本上将所有内容都向下推,这样我就可以在第一行添加我想要的内容)...顺便说一句,这被保存为可以在 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. 打开一个新的(临时的!)文件
  2. 写标题行
  3. 对于每个输入行,写入行(如果性能是一个问题,考虑 block 缓冲)
  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 可能不再高效且原子化,因为临时文件夹可能位于另一个卷/文件系统上。

关于c# - 在文本文件的顶部添加一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8235839/

相关文章:

c# - WebBrowser.Document.Body 始终为空

c# - 如何模拟 Asp.net 身份 UserManager 的 CreateAsync 方法

.net - MVP 模式,一个演示者有多少 View ?

python - 使用python写入csv文件时如何处理字符串

c# - 远程 IIS 的路径位置

c# - 将 String、Float 和 DateTime 值插入 sql 表

c# - .NET - 使用 AWS CDK 为 .NET 的低级 CloudFormation 资源构造标记 EC2 实例

c# - 可靠集合应用程序(组装)是否特定?

ruby-on-rails - 数据旁边的 CSV header - Rails Import

python - 为什么在编辑我的 csv 文件时出现 ValueError?