关于文件IO,读入一行并删掉改行的问题.
问题是这样的,我现在有一部分数据;我的软件是读取这些数据处理,然后保存.
最后保存到3个文件,处理成功的,处理失败的,未处理的.
本来我这些数据是直接读取内存里,最后一起保存的.
但是如果软件突然自动关闭,这些处理了几个小时的数据,也就无法保存了.
所以我想,实时保存.
就是每处理完1行数据,就保存1次.
但是问题就来了,处理成功的,和处理失败的,倒是好说,直接用IO的WriteLine方法,
在文件末尾的部分追加一行就行了.
但是未处理的文本,应该怎么保存,大家有思路没?
(ps:我想到的思路是,读取完1行文本,就删除掉该行,这样,即使软件突然关闭,
那么剩下的就都是未处理的了,但是关键问题就在这里,读取完第一行,并删掉该行,
需要把整个文件读取进来,然后再删除,删除完了再,把整个文件保存起来,这样就大大
降低了效率,万一文件有几百M,基本软件就成蜗牛了,所以想请大家想想办法,看是否
有好的思路?谢谢各位了) --------------------编程问答-------------------- 求大神指教.... --------------------编程问答-------------------- --------------------编程问答-------------------- 你按行处理的话,每处理一行可以另外文件保存一个行号,表示处理到第几行。
启动时检查一下上次处理到第几行就行了。
--------------------编程问答--------------------
呵呵,我也是这么想的,就是软件突然崩溃的话,不能保存未登录的 --------------------编程问答-------------------- var lines = File.ReadAllLines("未处理记录.txt");
lines = lines.Where(line => !(line 属于处理成功 || line 属于处理失败)).ToArray();
File.WriteAllLines(@"未处理记录.txt", lines);
--------------------编程问答-------------------- 你可以借鉴数据库的事务,采用一个操作日志。
int linesProcessed = 0;
int failures = 0;
int successes = 0;
string line;
while ((line = streamReader.ReadLine()) != null)
{
if (ProcessLine(line))
{
AppendJournal("Write Result:" , linesProcessed, successes);
WriteResult();
AppendJournal("Commit Result:" , linesProcessed, successes++);
}
else
{
AppendJournal("Write Failure:" , linesProcessed, failures);
WriteResult();
AppendJournal("Commit Failure:" , linesProcessed, failures++);
}
linesProcessed++;
}
比如你看到一个日志:
Write Result:0,0
Commit Result:0,0
Write Result:1,1
Commit Result:1,1
Write Failure:2,0
那么你就知道3条数据被处理了,前两条成功写出,但最后一条在写‘处理失败文件’的第0行时候断电了(也就是该行不可靠,如果有的话)。
这种情况,删除'处理失败文件'的第0行,如果有的话,然后从输入文件的第二行重新开始就可以了。
--------------------编程问答-------------------- 你可以未处理的文件流偏移量(也就是FileStream.Position)实时保存到配置,而不用实时去保存整个文件
即使软件关闭,程序下次运行时也可以通过配置文件中偏移量
using(var sr = File.OpenText(path))
{
if(配置.偏移量 > 0 && 配置.偏移量 < sr.BaseStream.Length)
{
sr.BaseStream.Position = 配置.偏移量;
}
while(!sr.EndOfStream)
{
var line = ReadLine();
if(处理成功(line))
{
配置.偏移量 = sr.BaseStream.Position;
配置.保存();
}
}
}
Application.Exit += 保存文件偏移量之前的数据到文件,重置 配置.偏移量 = 0; --------------------编程问答-------------------- 只记录个已处理的行号不行吗?
补充:.NET技术 , C#