求助:有没有这样的一次性写入文件函数?(200分)

  • 主题发起人 主题发起人 sxwy
  • 开始时间 开始时间
FileSeek(FileHandle, 0, 1);最后一个参数是1,你的是0
为1时是从最后往前,所以,第二参数设为0就是最后了
 
我爱PASCAL:
我直接用FileSeek(FileHandle, 0, 1);
数据不能追加到文件尾,而非要计算偏移量才行.怪事呀.[:(]
 
我爱PASCAL的方法用FILESEEK(FILEHANDLE,0,1)不能直接追加到已打开的文件尾,而张辉明的方式在被追加文件越来越大时(100多M),所耗时间很长很长,要几十秒钟,而且内存消耗丰常大.
请问张辉明朋友,在追加文件时,有没有办法减少内存消耗,能否做到当追加数据一样时,不会随着被追加文件的增大而费时越来越多呢?
我试了好多次都是这样,再来提问,请朋友们相助.谢谢.
 
刚刚测了一下我的代码,没有你说的问题。
const filename = 'e:/曹云峰.rmvb'; //175 MB (183,515,157 字节)

procedure TForm1.Button1Click(Sender: TObject);
var
Target : TFileStream;
tempdata : array[0..25] of byte ;
i :integer ;
start : DWORD ;
begin
start := GetTickCount ;
for i := 0 to 25 do
tempdata := i + 65 ;
if FileExists(filename) then
begin
Target := TFileStream.Create(filename, fmOpenWrite ) ;
Target.Seek(0, soFromEnd); //指针定位到文件尾部
end
else
Target := TFileStream.Create(filename, fmCreate or fmOpenWrite ) ;
try
Target.Write(tempdata, 26);
finally
Target.Free;
end;
ShowMessage('耗时:'+IntToStr(GetTickCount-start)+'ms');

end;

文件175MB多。测试结果:
耗时:10ms
由于程序很快,内存在任务管理器中根本看不到有什么变化。
到底是我们硬件性能差异,还是DELPHI的版本不同,还是我的程序有问题?
在这里大家能给你一些方法,思路,真正程序遇到各种问题,还是靠自己学会独思考啊。
 
谢谢张辉明的回帧,我再试了一下,还是过程的问题,你上面的是写一次.如果循环次数过多就会有问题:我的过程如下:
Count = 2000;
setlength(data1,40000);
setlength(data2,40000);
setlength(data3,40000);
For K := 0 to Count - 1 do//此过程全部将数据循环存入,每循环一次写入DATA1,DATA2,DATA3三个数组
begin
WCount := high(Data1) + 1;
if Mode = 0 then
begin
Target := TFileStream.Create(CreateFileName, fmOpenWrite );
Target.Seek(0, soFromEnd); //指针定位到文件尾
Target.Write(Data1[0], WCount);
Target.Seek(0, soFromEnd); //指针定位到文件尾
Target.Write(Data2[0], WCount);
Target.Seek(0, soFromEnd); //指针定位到文件尾
Target.Write(Data3[0], WCount);
Target.Free;
end

测试时,COUNT=2000,打开任务管理器之后,内存由可用的300多降为不到40M,最后电脑基本不能动了.提示虚似内存过低.
 
不看还好,看到你的代码,估计没几个人吃得消,非气炸了不可。你是测试机器性能?

如果Mode为0, 看看你的程序吧
2000次打开关闭文件操作,每次写3次文件,共6000次写文件操作。呵呵,怎么改只能靠你自己了。别人帮的了这次,可能帮不了下次的。

大家也让他独立思考吧
 
辉明兄弟呀,你以为我是好玩呀.这是实际的程序呀.我上面的DATA1,DATA2,DATA3是将一个BMP图片取出来的数据,有2000个图片,只好取2000次数据,然后这样写入了,然道还有更好的方式吗.程序我还优化了一下,要不更惨.一直在独立思考呀,没有办法了才上这里来求助了呢.
 
有3个数组,需要写到2000个文件中,是不是?
如果是这样,可以这样做优化:
1、把三个DATA数组,合成一个数组来做,这样一个文件只要一次写操作。
2、把长时间的数据处理放在线程中做来。不然窗口没响应。
 
谢谢提示,刚试过你说的方式,将三个数组的数据拷贝到一个数据内,将三次写文件合为写一次文件,但还是内存越来越小.时间和刚才的差不多.

窗口没响应也没关系.反自一次性处理完这2000个图片就是了.

是否我爱PASCAL兄弟的OPENFILE方式比张兄弟TEFILECREATE要快一点呢.但他的没有成功.
 
我觉得这个问题到这里已经可以结束了。就这个2000文件添加一段数据,还会出现什么 提示虚似内存过低 ,如果是这样那么WINDOWS系统复制个大点文件,应该死机才对。这次绝对不在回帖了。
 
唉,将上面的我说的有问题的代码复制到DELPHI里运行一次就知道了.不是电脑问题.我换过好几台电脑都是这样
 
多人接受答案了。
 
后退
顶部