当前位置:编程学习 > C#/ASP.NET >>

关于文件IO,读入一行并删掉改行的问题.

问题是这样的,我现在有一部分数据;
我的软件是读取这些数据处理,然后保存.
最后保存到3个文件,处理成功的,处理失败的,未处理的.
本来我这些数据是直接读取内存里,最后一起保存的.
但是如果软件突然自动关闭,这些处理了几个小时的数据,也就无法保存了.
所以我想,实时保存.
就是每处理完1行数据,就保存1次.
但是问题就来了,处理成功的,和处理失败的,倒是好说,直接用IO的WriteLine方法,
在文件末尾的部分追加一行就行了.
但是未处理的文本,应该怎么保存,大家有思路没?
(ps:我想到的思路是,读取完1行文本,就删除掉该行,这样,即使软件突然关闭,
那么剩下的就都是未处理的了,但是关键问题就在这里,读取完第一行,并删掉该行,
需要把整个文件读取进来,然后再删除,删除完了再,把整个文件保存起来,这样就大大
降低了效率,万一文件有几百M,基本软件就成蜗牛了,所以想请大家想想办法,看是否
有好的思路?谢谢各位了) --------------------编程问答-------------------- 求大神指教.... --------------------编程问答-------------------- --------------------编程问答-------------------- 你按行处理的话,每处理一行可以另外文件保存一个行号,表示处理到第几行。

启动时检查一下上次处理到第几行就行了。
--------------------编程问答--------------------
引用 3 楼 rtdb 的回复:
你按行处理的话,每处理一行可以另外文件保存一个行号,表示处理到第几行。

启动时检查一下上次处理到第几行就行了。

呵呵,我也是这么想的,就是软件突然崩溃的话,不能保存未登录的 --------------------编程问答-------------------- 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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,