就是建一个包*.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;
怎么生成这样一个结构的文件
谢谢大侠出招
谢谢
目录下边就是数据内容了
{ 定义文件系统的控制结构 }
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;
怎么生成这样一个结构的文件
谢谢大侠出招
谢谢
解决方案 »
- 程序写入服务的问题
- 谁知DELPHI6知道下载地址.!!!!!!急!!!!!!!!!!!!!
- delphi的生成程序
- ORA-01026:在连接列表中 > 2000大小的多个缓冲区
- Delphi中,往ACCESS数据库中添加数据?????
- 大家作数据库一般用什么控件???(谈者有分 )
- delphi远程调用weblogic发布的EJB,java access bridge如何配置?有尝咨询,测试成功付款,价格可谈QQ:3899406。
- delphi not found:'fcLabel.dcu'
- 有谁会做升级程序?
- 如何调用存储过程
- 江湖救急(实在是没分了,最后10分了)
- 发现Delphi2007一个bug,代码提示里,如果变量有下划线,则会有问题!
var
PfFileSysCtrl:TPfFileSysCtrl
begin
...
...
WriteBuffer(PfFileSysCtrl,sizeof(TPfFileSysCtrl));
...
...
end;
大侠,小弟才学DELPHI两个星期,能不能再详细点..
按我上面的结构给个详细的例子,行吗??
也许我要求有点过分,但是实在没有办法
谢谢了;
期待中~~!!!
给出就结贴..先给上面两位把分记上了
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;
这个是没用的,一时没注意多贴了
大侠,yf110大侠
试了,很难整,如何才能生成下面的*.pfs文件结构图:
——————————————————
| 文件名 | 个数 |
——————————————————
|id|name |扩展名 |偏移offset|lenth |-----这个是保存的数据的NAME等等
.
. |
. |
.
.
____________________________________
具体数据(每个文件的具体) ------这个是每个NAME项的数据内容
1.
2.
.
.
.
.
____________________________________
结束
其次我可一调出任意一个文件的数据内容...
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;
大侠
能不能给个例子,可能是小弟太苛刻了,能解决的话先给你加100分(放心,不回食言的,前面帮过我的也不会忘了的);小弟真的太笨了
谢谢
大侠
我想要具体的保存,读出例子(最好就按照上面的格式.小弟跪求了)
谢谢达人
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;
改下
fileLen:=fileLen+PfDirItem[i].len;
大侠不知道该如何感谢
先试下..
谢谢了
大侠能留个QQ吗??
大侠,也许我真的很苯,但是先给你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.如何任意添加一张图片到包以及删除任意一张??
大侠,真的谢谢了,是在是我不晓得如何下手..
A文件就是我写的用来建立索引的,B是打包文件的,最后通过A+B来建立一个完整的数据包
从目前来看以你的水平开发这样的软件功能似乎。
直接做成资源文件比较容易,有现成的API可以提供打包,检索,删除等操作
给小弟一个简单的例子吧...
就是说:A文件就是我写的用来建立索引的,B是打包文件的,最后通过A+B来建立一个完整的数据包,简单就好..
谢谢..
我不想用资源文件
老大求求了
大侠,也许我真的很苯,但是先给你100分
http://community.csdn.net/Expert/topic/5407/5407998.xml?temp=.6738092
请到这里领分
谢谢了...
怎么这样说呀..
那我把贴结了