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