我的应用程序提取数据并将其附加到文本文件,但我需要了解如何以编程方式查看文本文件的第一行,看它是否与以下文本匹配:
日期时间,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
答案 0 :(得分:8)
您需要重写整个文件。
此过程可以防止在进程中途出现(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()