你可以将*.mdb文件改为任何扩名,没关系的

解决方案 »

  1.   

    看看关于OLE结构化存贮的资料
    如果是普通的二进制文件你不是想怎么存就怎么村吗?
      

  2.   

    看看dbf格式的资料,模仿一个吧。
      

  3.   

    你可以定义个自己的结构,然后存储啊,我记得以前学C的时候做过,现在忘记了,
    如果你可以不用Delphi的话你可以用VC做很简单的
      

  4.   

    用结构化存贮,MS Execl,Word,Flash的Fla文件都是用的结构化存储
    例如以下过程查看系统中所有的该结构的文件,并加入到TListview里:
    procedure TForm1.AddFile(LV:TListview;SR:TSearchRec;Path:string);
    var
        FileInfo:TSHFileInfo;
    begin
    SHGetFileInfo(
                   PChar(Path+'\'+SR.Name) ,
                    0,
                    FileInfo,
                    SizeOf(FileInfo),
                    SHGFI_TYPENAME or SHGFI_SYSICONINDEX or SHGFI_ICON); with LV.Items.Add  do
         begin
         ImageIndex:=FileInfo.iIcon;
          Caption:=SR.Name;
           with SubItems do
           begin
             if  SR.Size<1024 then
                 Append(Format('%d bytes',[SR.Size]))
              else
                 Append(Format('%d k',[Round(SR.Size/1024)]));
             if FileInfo.szTypeName<>'' then
                Append(FileInfo.szTypeName)
              else
                Append('该文件在系统中未注册');
             Append(Path);
           end;
         end;
    end;procedure TForm1.SearchFileStructure(Path:String);
    var SR:TSearchRec;
        SubDirList:TStrings;  //子目录列表
        i:integer;
    begin
    Application.ProcessMessages;
    Screen.Cursor:=crHourGlass;
    SubDirList:=TStringList.Create;     //建立子目录列表
    Caption:='正在查找...'+Path;
    if FindFirst(Path+'\*.*', faDirectory ,SR) = 0 then
      begin
      if IsFold(SR) then
         SubDirList.Add(SR.Name);
      if StgIsStorageFile(PWideChar(WideString(Path+'\'+SR.Name)))=S_OK then
         AddFile(View,SR,Path);
          while FindNext(SR) = 0 do
          begin
           if IsFold(SR) then
              SubDirList.Add(SR.Name);
           if StgIsStorageFile(PWideChar(WideString(Path+'\'+SR.Name)))=S_OK then
              AddFile(View,SR,Path);
          end;
      end;
      FindClose(SR);
    for i:=0 to  SubDirList.Count-1 do    //递归子目录
        SearchFileStructure(Path+'\'+SubDirList[i]);
    Screen.Cursor:=crDefault;
    SubDirList.Free;
    end;function IsFold(SR:TSearchRec):Boolean;
    begin
      if (SR.Attr=16) and (SR.Name<>'.') and (SR.Name<>'..') then
          Result:=True
      else
          Result:=False;
    end;查看结构化存储文件内部结构
    procedure TForm1.RecurseStorage(ParentNode:TTreeNode;stg:IStorage);
    var
     EnumStatStg: IEnumStatStg;
     StatStg:     TStatStg;
     NodeName:    String;
     ChildNode:   TTreeNode;
     StgChild :   IStorage;
    begin
    OLECheck(stg.EnumElements(0,nil,0,EnumStatStg));while EnumStatStg.Next(1,StatStg,nil)=S_OK do
     begin
      NodeName:=StatStg.pwcsName;
      if Ord(NodeName[1])<32 then
            NodeName:='#'+IntToStr(Ord(NodeName[1]))+
                      Copy(NodeName,2,length(NodeName)-1);
      {$IFDEF VER 100}
      ChildNode:=StruTree.Items.AddChild(ParentNode,NodeName+
                            '('+FloatToStr(Statstg.cbSize)+'bytes)');
       {$ELSE}   ChildNode:=StruTree.Items.AddChild(ParentNode,NodeName+
                            '('+IntToStr(Statstg.cbSize)+'bytes)');   {$ENDIF}  if StatStg.dwType=STGTY_STORAGE then
       begin   //注意这里打开子存储是 “OpenStorage”不是"stgOpenStorage"
        OLECheck(stg.OpenStorage(StatStg.pwcsName,
                                 nil,
                                 STGM_READ or STGM_SHARE_EXCLUSIVE,
                                 nil,0,stgChild));
    // 递归处理子存储
      RecurseStorage(ChildNode,stgChild);
      end;
    end;  // whileend;
    procedure TForm1.DisplayFileStructure(FileName:WideString);
    var stgRoot:  IStorage;
        Node:    TTreeNode;
    begin
    if StgIsStorageFile(PWideChar(FileName))<>S_OK then
     begin
      MessageDlg(Format('%s 不是一个结构化文件!'+#13+'或者未找到该文件',[FileName]),
                 mtWarning,
                 [mbOk],
                 0);
      exit;
     end;
    OLECheck(stgOpenStorage(PWideChar(FileName),
                            nil,
                            STGM_READ or STGM_SHARE_EXCLUSIVE,
                            nil,
                            0,
                            stgRoot));
     StruTree.Items.BeginUpdate; //StruTree :Treeview
     try
      StruTree.Items.Clear;
      Node:= StruTree.Items.Add(nil,'根存储<Root>');
      RecurseStorage(Node,stgRoot);
      Node.Expand(True);
     finally
      StruTree.Items.EndUpdate;
     end;
    end;建立文件,并写入内容:
    var w,h:integer;
       stg:     IStorage;
       stmData: IStream;
       OS:      TOLEStream;
    procedure TForm1.Button1Click(Sender: TObject);
    var fn:PWideChar;
    begin
    w:=form1.Width ; h:=form1.Height;
    if not SD.Execute then exit; //SD:TSaveDialog
    fn:=PWideChar(WideString(SD.filename+'.liu'));
    OLECheck(stgCreateDocFile(fn
                              ,STGM_Create
                              or STGM_READWRITE
                              or STGM_SHARE_EXCLUSIVE
                              ,0
                              ,stg));
    OLECheck(stg.CreateStream('info',STGM_CREATE or STGM_WRITE OR
                             STGM_SHARE_EXCLUSIVE,0,0,stmData));
    OLECheck(stg.OpenStream('info',nil,STGM_READWRITE or
                             STGM_SHARE_EXCLUSIVE,0,stmData));
    OS:=TOLEStream.Create(stmData);
    try
    Image1.Picture.Graphic.SaveToStream(OS); //将TImage的内容写入到OS
    Richedit1.Lines.SaveToStream(OS);  //将TRichEdit的内容写入到OS
    OS.Write(w,sizeof(w));
    OS.Write(h,sizeof(h));
    finally
    OS.Free;
    end;end;读出内容:
    procedure TForm1.Button2Click(Sender: TObject);
    var fn:PWideChar;
    begin
    if not OD.Execute then exit; //OD :TOpenDialog
    fn:=PWideChar(WideString(OD.filename));
    OLECheck(stgOpenStorage(fn,nil,STGM_READWRITE or
                            STGM_SHARE_EXCLUSIVE,nil,0,stg));
    stg.OpenStream('info',nil,STGM_READ or STGM_SHARE_EXCLUSIVE,0,stmData);
    OS:=TOLEStream.Create(stmData);
    try
    Image1.Picture.Graphic.LoadFromStream(OS);
    Richedit1.Lines.LoadFromStream(OS);
    OS.Read(w,sizeof(w));
    OS.Read(h,sizeof(h));
    width:=w;
    h:=height;
    finally
    OS.Free;
    end;end;