利用流向文件头部追加数据

时间:2022-08-18 19:35:08
我发现如果定位到文件最开始后写数据,会将源文件的内容覆盖。请问如何在保持源文件内容完整的前提下向其开始处追加数据(考虑到源文件很大,将源文件追加到数据末尾需要花费很长时间,我不想这样)?
谢谢~

13 个解决方案

#1


使用一个新流,现将要添加在头部的数据添加,然后再源文件流添加,不就可以了,

#2


如果文件比较大,可以分段读分段追加

#3


写到文件头上回节省时间么?可能是我孤陋寡闻了,哈
我向一个250M大小的文件写1M数据,耗时基本上在15ms到31ms,这个应该不怎么影响性能吧?

#4


  FStream := TFileStream.Create('A.dat', fmOpenReadWrite);
  try
    FStream.Seek(0, soEnd);
    FStream.Write(FTick, SizeOf(Cardinal));
    FStream.Write(Temp, SizeOf(TBudded)); //TBudded里面有1M数据
  finally
    FStream.Free;
  end;

写10M数据基本在130ms左右,

#5


我的意思是:
假如有A(500MB),B(1KB)两个文件,我想要它们合并成一个文件,并且让B在前面,A紧随其后。

有什么办法(考虑的时间问题,我只能做到让A在前面,B紧随其后)?

#6


参考budded的代码,注意seek的用法。

#7


budded的不也是seek到了尾部吗?

#8


是的,那段代码的作用就是向A文件追加数据,速度应该不慢。

另外,操作大文件可以采用内核对象,比如CreateFileMapping,MapViewOfFile等函数,速度超快!

#9


如果经常需要插入数据,那就是设计有问题了。

#10


...(考虑到源文件很大,将源文件追加到数据末尾需要花费很长时间,我不想这样)...
-------

这个观点是不对的,对于向文件追加数据来说,“追加到末尾”是所有方式中效率最高的一种,
因为不需要“搬动”任何已有的数据。

#11


    ...(考虑到源文件很大,将源文件追加到数据末尾需要花费很长时间,我不想这样)... 
    ------- 

    这个观点是不对的,对于向文件追加数据来说,“追加到末尾”是所有方式中效率最高的一种, 
     因为不需要“搬动”任何已有的数据。

------- 
    如果要把一个200MB的文件追加到末尾总得需要半分钟吧。我的目的只是将几KB的数据加到大文件的头部。不知道有没有不用“搬动”数据的方法?

#12


如果要把一个200MB的文件追加到末尾总得需要半分钟吧。我的目的只是将几KB的数据加到大文件的头部。不知道有没有不用“搬动”数据的方法?

===============================================

往文件头插入数据而不用“搬动”数据的高效办法是不存在。

文件的数据类型本质是"流",与线性表类似。在文件尾添加或删除数据是最容易的,是不用“搬动”数据。而在文件中或文件头插入或删除数据都将"搬动"插入或删除位置处之后的全部或部分数据。

#13


谢谢~看来我只能搬动数据了。。

#1


使用一个新流,现将要添加在头部的数据添加,然后再源文件流添加,不就可以了,

#2


如果文件比较大,可以分段读分段追加

#3


写到文件头上回节省时间么?可能是我孤陋寡闻了,哈
我向一个250M大小的文件写1M数据,耗时基本上在15ms到31ms,这个应该不怎么影响性能吧?

#4


  FStream := TFileStream.Create('A.dat', fmOpenReadWrite);
  try
    FStream.Seek(0, soEnd);
    FStream.Write(FTick, SizeOf(Cardinal));
    FStream.Write(Temp, SizeOf(TBudded)); //TBudded里面有1M数据
  finally
    FStream.Free;
  end;

写10M数据基本在130ms左右,

#5


我的意思是:
假如有A(500MB),B(1KB)两个文件,我想要它们合并成一个文件,并且让B在前面,A紧随其后。

有什么办法(考虑的时间问题,我只能做到让A在前面,B紧随其后)?

#6


参考budded的代码,注意seek的用法。

#7


budded的不也是seek到了尾部吗?

#8


是的,那段代码的作用就是向A文件追加数据,速度应该不慢。

另外,操作大文件可以采用内核对象,比如CreateFileMapping,MapViewOfFile等函数,速度超快!

#9


如果经常需要插入数据,那就是设计有问题了。

#10


...(考虑到源文件很大,将源文件追加到数据末尾需要花费很长时间,我不想这样)...
-------

这个观点是不对的,对于向文件追加数据来说,“追加到末尾”是所有方式中效率最高的一种,
因为不需要“搬动”任何已有的数据。

#11


    ...(考虑到源文件很大,将源文件追加到数据末尾需要花费很长时间,我不想这样)... 
    ------- 

    这个观点是不对的,对于向文件追加数据来说,“追加到末尾”是所有方式中效率最高的一种, 
     因为不需要“搬动”任何已有的数据。

------- 
    如果要把一个200MB的文件追加到末尾总得需要半分钟吧。我的目的只是将几KB的数据加到大文件的头部。不知道有没有不用“搬动”数据的方法?

#12


如果要把一个200MB的文件追加到末尾总得需要半分钟吧。我的目的只是将几KB的数据加到大文件的头部。不知道有没有不用“搬动”数据的方法?

===============================================

往文件头插入数据而不用“搬动”数据的高效办法是不存在。

文件的数据类型本质是"流",与线性表类似。在文件尾添加或删除数据是最容易的,是不用“搬动”数据。而在文件中或文件头插入或删除数据都将"搬动"插入或删除位置处之后的全部或部分数据。

#13


谢谢~看来我只能搬动数据了。。