C# 在文本文件顶部添加一行

C# 在文本文件顶部添加一行,c#,.net,csv,formatting,C#,.net,Csv,Formatting,我的应用程序提取数据并将其附加到文本文件,但我需要了解如何以编程方式查看文本文件的第一行,并查看它是否与以下文本匹配: 日期时间、虚拟IP、虚拟端口、虚拟名称、目的地IP、目的地端口、状态、所需 如果它继续执行正常功能(下面的代码段),如果第一行与上面的不一样,那么我想在第一行插入上面的内容,而不覆盖当前的内容。我该怎么做?(基本上是将所有内容向下推一行,以便我可以在第一行添加我想要的内容)…顺便说一句,这将保存为csv文件,可以在excel中打开 try { // ... fo

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

日期时间、虚拟IP、虚拟端口、虚拟名称、目的地IP、目的地端口、状态、所需

如果它继续执行正常功能(下面的代码段),如果第一行与上面的不一样,那么我想在第一行插入上面的内容,而不覆盖当前的内容。我该怎么做?(基本上是将所有内容向下推一行,以便我可以在第一行添加我想要的内容)…顺便说一句,这将保存为csv文件,可以在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;

你需要重写整个文件

  • 打开一个新的(临时!)文件
  • 写入标题行
  • 对于每个输入行,写入行(如果性能是一个问题,请考虑块缓冲)
  • 刷新并关闭输出文件
  • 只有在没有错误时,才将临时文件移动到位(通过重命名)
  • 当过程中途出现(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)
    ,以防止在已存在同名文件的情况下覆盖临时文件


    另一个解决办法是使用。但是,然后
    File.Replace
    可能不再有效和原子化,因为tempfolder可能位于另一个卷/文件系统上。

    您需要搜索到第一个位置以查看它是否匹配这些单词,此代码片段可以实现您要查找的内容

        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”。标签是为你做的。是的,我知道,但我这样做是为了更好的可视性标签会为你做的。你所做的只是让你的标题更难阅读,这样别人就不太可能读到它并帮助你了。这不是一个新闻组或讨论论坛。这是可行的,但当我再次运行该工具时,它会再次在顶部插入该行。我只想要它一次,我如何才能找到第0行,读取它,如果它与标题匹配,然后跳过这个过程?这对我来说很有效,我只是做了一个if/else语句来验证第一行是否与标题匹配。非常感谢。
        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()