如何删除文件中的所有行,然后在 Compact Framework 3.5 c# 中重写文件
How to remove all lines in a file, then rewrite the file in Compact Framework 3.5 c#
在使用 Windows Forms 应用程序的 .net 框架中,我可以清除文件,然后将我想要的数据写回该文件。
这是我在 Windows 表单中使用的代码:
var openFile = File.OpenText(fullFileName);
var fileEmpty = openFile.ReadLine();
if (fileEmpty != null)
{
var lines = File.ReadAllLines(fullFileName).Skip(4); //Will skip the first 4 then rewrite the file
openFile.Close();//Close the reading of the file
File.WriteAllLines(fullFileName, lines); //Reopen the file to write the lines
openFile.Close();//Close the rewriting of the file
}
openFile.Close();
openFile.Dispose();
我正在尝试用紧凑的框架做同样的事情。我可以保留我想要的行,然后删除文件中的所有行。但是我无法重写文件。
下面是我的精简框架代码:
var sb = new StringBuilder();
using (var sr = new StreamReader(fullFileName))
{
// read the first 4 lines but do nothing with them; basically, skip them
for (int i = 0; i < 4; i++)
sr.ReadLine();
string line1;
while ((line1 = sr.ReadLine()) != null)
{
sb.AppendLine(line1);
}
}
string allines = sb.ToString();
openFile.Close();//Close the reading of the file
openFile.Dispose();
//Reopen the file to write the lines
var writer = new StreamWriter(fullFileName, false); //Don't append!
foreach (char line2 in allines)
{
writer.WriteLine(line2);
}
openFile.Close();//Close the rewriting of the file
}
openFile.Close();
openFile.Dispose();
您的代码
foreach (char line2 in allines)
{
writer.WriteLine(line2);
}
正在写出原始文件的 个字符,每个单独一行。
请记住,allines
是一个字符串,恰好在文件的原始字符串之间有 Environment.NewLine。
您可能打算做的只是
writer.WriteLine(allines);
更新
您多次关闭 openFile(您应该只执行一次),但您没有刷新或关闭您的 writer。
尝试
using (var writer = new StreamWriter(fullFileName, false)) //Don't append!
{
writer.WriteLine(allines);
}
确保 writer 被处理并因此被刷新。
如果您打算这样做,以便为日志文件提供类似 "rotating" 缓冲区的东西,请考虑大多数 Windows CE 设备使用闪存作为存储介质,您的方法将生成完整的重新每次写入整个文件(整个 - 4 行)。如果这种情况经常发生(每隔几秒),这可能会磨损我们的闪存,很快达到其最大擦除周期数(很快可能意味着几周或几个月)。
另一种方法是在旧日志文件达到最大大小时重命名它(删除任何现有的同名文件)并创建一个新文件。
在这种情况下,您的日志记录信息将拆分为两个文件,但您将始终附加到现有文件,从而限制您执行的写入次数。从闪存文件系统的角度来看,重命名或删除文件也不是繁重的操作。
在使用 Windows Forms 应用程序的 .net 框架中,我可以清除文件,然后将我想要的数据写回该文件。
这是我在 Windows 表单中使用的代码:
var openFile = File.OpenText(fullFileName);
var fileEmpty = openFile.ReadLine();
if (fileEmpty != null)
{
var lines = File.ReadAllLines(fullFileName).Skip(4); //Will skip the first 4 then rewrite the file
openFile.Close();//Close the reading of the file
File.WriteAllLines(fullFileName, lines); //Reopen the file to write the lines
openFile.Close();//Close the rewriting of the file
}
openFile.Close();
openFile.Dispose();
我正在尝试用紧凑的框架做同样的事情。我可以保留我想要的行,然后删除文件中的所有行。但是我无法重写文件。
下面是我的精简框架代码:
var sb = new StringBuilder();
using (var sr = new StreamReader(fullFileName))
{
// read the first 4 lines but do nothing with them; basically, skip them
for (int i = 0; i < 4; i++)
sr.ReadLine();
string line1;
while ((line1 = sr.ReadLine()) != null)
{
sb.AppendLine(line1);
}
}
string allines = sb.ToString();
openFile.Close();//Close the reading of the file
openFile.Dispose();
//Reopen the file to write the lines
var writer = new StreamWriter(fullFileName, false); //Don't append!
foreach (char line2 in allines)
{
writer.WriteLine(line2);
}
openFile.Close();//Close the rewriting of the file
}
openFile.Close();
openFile.Dispose();
您的代码
foreach (char line2 in allines)
{
writer.WriteLine(line2);
}
正在写出原始文件的 个字符,每个单独一行。
请记住,allines
是一个字符串,恰好在文件的原始字符串之间有 Environment.NewLine。
您可能打算做的只是
writer.WriteLine(allines);
更新
您多次关闭 openFile(您应该只执行一次),但您没有刷新或关闭您的 writer。
尝试
using (var writer = new StreamWriter(fullFileName, false)) //Don't append!
{
writer.WriteLine(allines);
}
确保 writer 被处理并因此被刷新。
如果您打算这样做,以便为日志文件提供类似 "rotating" 缓冲区的东西,请考虑大多数 Windows CE 设备使用闪存作为存储介质,您的方法将生成完整的重新每次写入整个文件(整个 - 4 行)。如果这种情况经常发生(每隔几秒),这可能会磨损我们的闪存,很快达到其最大擦除周期数(很快可能意味着几周或几个月)。 另一种方法是在旧日志文件达到最大大小时重命名它(删除任何现有的同名文件)并创建一个新文件。 在这种情况下,您的日志记录信息将拆分为两个文件,但您将始终附加到现有文件,从而限制您执行的写入次数。从闪存文件系统的角度来看,重命名或删除文件也不是繁重的操作。