用什么最好的方法来删除大容量文本文件的最后4行?(50分)

  • 主题发起人 主题发起人 c.jack
  • 开始时间 开始时间
C

c.jack

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在的程序是:
str:=tstringlist.Create();
str.LoadFromFile('e:/test.txt');
for x:=str.Count-1 downto str.Count-5 do
str.Delete(x)
str.SaveToFile('e:/wm.txt');

但是我不知道这种方法对很大的文件,如500M的处理效果。
 
很慢,非常慢,特别慢!

读分区表,读出文件大小。
读出位置,到着在磁盘中找5个 "0D 0A"
修改文件大小和前后位置,释放修改后,没有的5行空间。

只是一个意向,估计实现比较困难:)
 
用二进制的Char/byte打开,Seek到尾部,找到要的回车,Truncate(f)
 
同意张慧的
 
//处理5.23 MB文本眨眼间。
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
TextDataSet1.FileName := 'f:/temp/c.txt';
TextDataSet1.Open;
i := 0;
repeat
inc(i);
TextDataSet1.Last;
TextDataSet1.Delete;
until i > 3;
TextDataSet1.Close;
close;
end;
 
不过对于500M好像也是很慢
 
只能这么办了。
 
楼上的,TextDataSet是什么东东?
 
Writer:
../Borland/Delphi6/Demos/Db/TextData/textpkg.dpk
 
打开文件,已到最后5个字节,设置文件结束符,用api可以实现,
不过不知道速度是不是足够快。

使用TFileStream应该也可以达到。
fs:=TFileStream.create('...');
try
fs.size:=fs.size-5;
finally
fs.free;
end;
 
Pan Ying,是最后4行,不是4个字节
 
看错了,不好意思,那只能倒溯寻找了,找到4个#13#10再加上结束符了。
 
试试
内存影射文件,从最后找4次#13#10,把指针定位该处,把后面的删了,
 
自从小贝提到影射,就什么都影射了,500M的文件,要是全部影射得500M内存呢
要是影射一部分,又不知道得影射多少。
还不如直接读文件呢
 
呵呵,这可不能怪我,是人家的选择:-)
不过映射又不能从末尾开始,因此不能采用部分映射的方法,
当然不能全部映射了,我又不喝酒:-) 直接读吧
再不行你用汇编吧,不过没有效果可别找我 :-)
 
可以映射一部分的,你看看MapViewOfFile吧
对于大的文件如果要使用映射,是需要每次映射一步分的
 
从末尾开始影射,是需要先检查文件多大,然后从后面算起xx k开始影射到最后……
 
//可以映射一部分的
当然可以部分映射,不过我认为本例不适合用.由于位置不定,需要
一次映射一块进行搜索要是一次就找到 3 个回车换行当然好,可
要是....就需要反复进行映射,麻烦.

当然,话又说回来,要是只删除最后4行的话,也可以这样用,毕竟4行
不应该很大,你从末尾映射个 1M,一般都能够一次搞定.就怕你哪天
突然要删除最后 1000 行,那就不一定了:-)
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部