就是建一个包*.pfs,包头的结构是TPfFileSysCtrl,定义目录项结构  TPfDirItem
目录下边就是数据内容了
  { 定义文件系统的控制结构 }
  PTPfFileSysCtrl = ^TPfFileSysCtrl;
  TPfFileSysCtrl = record
    fileNum: word; { 包内包含的文件个数 }
    dirItemNum: word; { 包内目录项个数 }
    pad: array[0..27] of byte;
  end;  { 定义目录项结构 }
  PTPfDirItem = ^TPfDirItem;
  TPfDirItem = record
    fileId: word; { 文件ID: ID为0的目录项为空闲目录项 }
    filename: array[0..17] of char; { 文件名 }
    extname: array[0..3] of char; { 扩展名 }
    offset: dword; { 文件在包内的偏移 }
    len: dword; { 文件长度 }
  end;
怎么生成这样一个结构的文件
谢谢大侠出招
谢谢

解决方案 »

  1.   

    直接按这个结构write就可以了
    var
    PfFileSysCtrl:TPfFileSysCtrl
    begin
    ...
    ...
    WriteBuffer(PfFileSysCtrl,sizeof(TPfFileSysCtrl));
    ...
    ...
    end;
      

  2.   

    TO ALL:
        大侠,小弟才学DELPHI两个星期,能不能再详细点..
    按我上面的结构给个详细的例子,行吗??
    也许我要求有点过分,但是实在没有办法
    谢谢了;
    期待中~~!!!
    给出就结贴..先给上面两位把分记上了
      

  3.   

    var
      fst: TFileStream;
    begin
      fst:= nil;
      try
        st:= 'fsaddfa';
        fst:= TFileStream.Create('c:\fdas.fsp', fmCreate);
        fst.WriteBuffer(TPfFileSysCtrl, sizeof(TPfFileSysCtrl));
        while .... do
        begin
          ....
          fst.WriteBuffer(TPfDirItem, sizeof(TPfDirItem));
          ....
        end;
      finally
        fst.Free;
      end;
    end;
      

  4.   

    st:= 'fsaddfa';
    这个是没用的,一时没注意多贴了
      

  5.   

    to all:
        大侠,yf110大侠
        试了,很难整,如何才能生成下面的*.pfs文件结构图:
    ——————————————————
    | 文件名         | 个数            |
    ——————————————————
    |id|name |扩展名 |偏移offset|lenth |-----这个是保存的数据的NAME等等
    .
    .                                  |
    .                                  |
    .
    .
    ____________________________________
    具体数据(每个文件的具体)             ------这个是每个NAME项的数据内容
    1.
    2.
    .
    .
    .
    .
    ____________________________________
    结束
    其次我可一调出任意一个文件的数据内容...
      

  6.   

    保存的时候要按这样个顺序保存
    1:TPfFileSysCtrl
    2:TPfDirItem * 数量 
    3: 具体文件数据读的时候
    先读出头文件
    var
      fst: TFileStream;
      PfFileSysCtrl:TPfFileSysCtrl;
      PfDirItem:TPfDirItem;
      FileSysPos,n:Integer;
    begin
      fst:= nil;
       fst:= TFileStream.Create('c:\fdas.fsp', fmCreate);
    //先读出头信息
       fst.Position:=0;
       fst.ReadBuffer(PfFileSysCtrl, sizeof(TPfFileSysCtrl));
    //然后就是顺序的每个文件的索引 TPfDirItem结构
       FileSysPos:=fst.Position;  //FileSysPos就是第1个文件信息的起始位置偏移量
    //如果任意读第n个,就是sizeof(TPfFileSysCtrl) * n
    fst.Position:=FileSysPos + sizeof(TPfFileSysCtrl) * n
       fst.ReadBuffer(TPfDirItem, sizeof(TPfDirItem));....
    ....
    end;
      

  7.   

    to SonicX(SonicX) 
       大侠
       能不能给个例子,可能是小弟太苛刻了,能解决的话先给你加100分(放心,不回食言的,前面帮过我的也不会忘了的);小弟真的太笨了
    谢谢
      

  8.   

    to all:
        大侠
       我想要具体的保存,读出例子(最好就按照上面的格式.小弟跪求了)
    谢谢达人
      

  9.   

    需要一个SaveDialog1: TSaveDialog;//Save 过程
    const
      FileNum=3; //假设3个文件
    var
      fst: TFileStream;
      PfFileSysCtrl:TPfFileSysCtrl;
      PfDirItem:array[1..FileNum] of TPfDirItem;
      i:integer;
      fileLen:integer;
    begin
     if not SaveDialog1.Execute then exit;
     //定义TPfFileSysCtrl结构
     PfFileSysCtrl.fileNum:=FileNum;
     //初始化TPfDirItem结构
     for i:=low(PfDirItem) to high(PfDirItem) do begin
        PfDirItem[i].filename:='aaa';
        PfDirItem[i].extname :='tmp';
        PfDirItem[i].len := 1024;
     end;
     //定义文件偏移量
     fileLen:=0;
     for i:=low(PfDirItem) to high(PfDirItem) do begin
       PfDirItem[i].offset:=Sizeof(TPfFileSysCtrl)+sizeof(TPfDirItem)*FileNum+fileLen;
       fileLen:=PfDirItem[i].len;
     end;
     //写文件
     fst:= TFileStream.Create(SaveDialog1.FileName, fmCreate);
     //文件头 TPfFileSysCtrl
     fst.WriteBuffer(PfFileSysCtrl, sizeof(TPfFileSysCtrl));
     //文件索引TPfDirItem
     for i:=low(PfDirItem) to high(PfDirItem) do
       fst.WriteBuffer(PfDirItem[i], sizeof(TPfDirItem));
     //具体文件数据
     //...(略)
     //...
     //...
     fst.Free;
    end;//read过程
    var
      fst: TFileStream;
      PfFileSysCtrl:TPfFileSysCtrl;
      PfDirItem:TPfDirItem;
      FileSysPos:int64;
      n:integer;
    begin
     if not SaveDialog1.Execute then exit;
     fst:=TFileStream.Create(SaveDialog1.FileName,fmOpenRead);
     //先文件头TPfFileSysCtrl
       fst.Position:=0;
       fst.ReadBuffer(PfFileSysCtrl, sizeof(TPfFileSysCtrl));
      //文件索引TPfDirItem
      FileSysPos:=fst.Position;  //FileSysPos就是第1个文件信息的起始位置偏移量
      //如果任意读第n个,就是sizeof(TPfFileSysCtrl) * n
      //比如读出第2个
      n:=2;
      fst.Position:=FileSysPos + sizeof(TPfFileSysCtrl) * n;
      fst.ReadBuffer(PfDirItem, sizeof(TPfDirItem));
      showmessage('偏移量'+inttostr(PfDirItem.offset)+#13+#10+'文件大小'+inttostr(PfDirItem.len));
      //...
      //...
      fst.free;
    end;
      

  10.   

    fileLen:=PfDirItem[i].len;
    改下
    fileLen:=fileLen+PfDirItem[i].len;
      

  11.   

    to SonicX(SonicX) 
       大侠不知道该如何感谢
     先试下..
    谢谢了
       大侠能留个QQ吗??
      

  12.   

    to SonicX(SonicX) 
       大侠,也许我真的很苯,但是先给你100分
      http://community.csdn.net/Expert/topic/5407/5407998.xml?temp=.6738092
       其次,我是想要把图片加到"具体数据"那里(具体数据是图片,我用Cjt_AddtoFile来添加不知道要得不?因为每次都是把数据加到PFS包的后面,现在是不知道怎么加?)
    function TForm1.Cjt_AddtoFile(SourceFile, TargetFile: string): Boolean;
    var
      Target, Source: TFileStream;
      MyFileSize: integer;
    begin
      try
        Source := TFileStream.Create(SourceFile, fmOpenRead or fmShareExclusive);
        Target := TFileStream.Create(TargetFile, fmOpenWrite or fmShareExclusive);
        try
          Target.Seek(0, soFromEnd); //往尾部添加资源
          Target.CopyFrom(Source, 0);
          // k := Source.Size;
          // i := Sizeof(MyFileSize);
          MyFileSize := Source.Size + Sizeof(MyFileSize); //计算资源大小,并写入辅程尾部
          //////j := MyFileSize;
          Target.WriteBuffer(MyFileSize, sizeof(MyFileSize));
        finally
          Target.Free;
          Source.Free;
        end;
      except
        Result := False;
        Exit;
      end;
      Result := True;
    end;问题:
    1.我如何把图片文件加到PFS里面?
    2.我怎么才能把读任意的一张图片以及该图片的信息(ID,NAME,LEN,OFFSET)?
    3.如何任意添加一张图片到包以及删除任意一张??
    大侠,真的谢谢了,是在是我不晓得如何下手..
      

  13.   

    需要建立2个文件流
    A文件就是我写的用来建立索引的,B是打包文件的,最后通过A+B来建立一个完整的数据包
    从目前来看以你的水平开发这样的软件功能似乎。
    直接做成资源文件比较容易,有现成的API可以提供打包,检索,删除等操作
      

  14.   

    to SonicX(SonicX) 
       给小弟一个简单的例子吧...
       就是说:A文件就是我写的用来建立索引的,B是打包文件的,最后通过A+B来建立一个完整的数据包,简单就好..
       谢谢..
       我不想用资源文件
      老大求求了
      

  15.   

    to SonicX(SonicX) 
       大侠,也许我真的很苯,但是先给你100分
      http://community.csdn.net/Expert/topic/5407/5407998.xml?temp=.6738092
    请到这里领分
      

  16.   

    to SonicX(SonicX) 
       谢谢了...
       怎么这样说呀..
    那我把贴结了