我想存一些数据到本地的文件上,存成二进制文件,用TFileStream实现.但是发现用TFILESTREAM的Write方法写文件会把原来的内容全覆盖,如果我想每次打开文件后从最后开始写起怎么办呢?还有别的写文件的方案吗?

解决方案 »

  1.   

    参考
    http://138soft.com/htm/AuthorArt/index.htm你打开文件的时候定位下指针
    Function Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;
    参数Offset为偏移字节数
    参数Origint指出Offset的实际意义,其可能的取值如下:
    soFromBeginning:Offset为移动后指针距离数据开始的位置。此时Offset必须大于或者等于零。
    soFromCurrent:Offset为移动后指针与当前指针的相对位置。
    soFromEnd:Offset为移动后指针距离数据结束的位置。此时Offset必须小于或者等于零。该方法返回值为移动后指针的位置。
      

  2.   

    To enzhiyiqiu(蜀道消程) 
      我已经定位到文件末尾再写的,还是会覆盖.源码在此:
    procedure WriteDATA(pData : PDATA );
    Var
      fileStream: TFileStream;
    Begin
      fileStream := TFileStream.Create('data.tem',fmcreate);
      fileStream.Seek(0,soFromEnd);
      fileStream.Writebuffer(pDATA^,sizeof(DATA));
      fileStream.Free;
    End;
      

  3.   

    是不是打开文件的时候模式错了?应该是
    fmOpenReadWrite吧??
      

  4.   

    使用文件流我也不熟悉,不过看程序估计你理解错了,现在你是把指针定位到了文件流的尾部,而要把后面的数据加进来的话,你需要把长度相加,然后再把整个数据保存下去,相当于要把前面的数据也读到流中,再把后面的数据也读到流中,再整个写,不知道我的理解是否正确。平时我的习惯是先用  fileopen() 打开,然后用fileseek定位到尾部,再用 Writefile写
      

  5.   

    procedure WriteDATA(pData : PDATA );
    Var
      fileStream: TFileStream;
    Begin
      if not FIleExists('data.tem') then
      begin
       fileStream := TFileStream.Create('data.tem',fmcreate);
       fileStream.Seek(0,soFromBeginning)
        else
          begin
          fileStream := TFileStream.Create('data.tem',fmOpenWrite or fmShareDenyNone);
          fileStream.Seek(0,soFromEnd);
          end;
      fileStream.Writebuffer(pDATA^,sizeof(DATA));
      fileStream.Free;
    End;
      

  6.   

    其实,老方法也不错么。assignfile(f,filename);
    append(f);//这一句经典,在文件尾部添加数据
    write(f,~~~);
    read(f,~~~);呵呵,即便是用filestream也可以现把文件中的数据保存下来(保存到内存中),然后再一气写进文件里面么。这样写之前还可以排序,提高数据的访问效率。