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

解决方案 »

  1.   

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

  2.   

      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左右,
      

  3.   

    我的意思是:
    假如有A(500MB),B(1KB)两个文件,我想要它们合并成一个文件,并且让B在前面,A紧随其后。有什么办法(考虑的时间问题,我只能做到让A在前面,B紧随其后)?
      

  4.   

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

  5.   

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

  6.   

    是的,那段代码的作用就是向A文件追加数据,速度应该不慢。另外,操作大文件可以采用内核对象,比如CreateFileMapping,MapViewOfFile等函数,速度超快!
      

  7.   

        ...(考虑到源文件很大,将源文件追加到数据末尾需要花费很长时间,我不想这样)... 
        -------     这个观点是不对的,对于向文件追加数据来说,“追加到末尾”是所有方式中效率最高的一种, 
         因为不需要“搬动”任何已有的数据。------- 
        如果要把一个200MB的文件追加到末尾总得需要半分钟吧。我的目的只是将几KB的数据加到大文件的头部。不知道有没有不用“搬动”数据的方法?
      

  8.   

    如果要把一个200MB的文件追加到末尾总得需要半分钟吧。我的目的只是将几KB的数据加到大文件的头部。不知道有没有不用“搬动”数据的方法?===============================================往文件头插入数据而不用“搬动”数据的高效办法是不存在。文件的数据类型本质是"流",与线性表类似。在文件尾添加或删除数据是最容易的,是不用“搬动”数据。而在文件中或文件头插入或删除数据都将"搬动"插入或删除位置处之后的全部或部分数据。