如何创建自定义文件头的文件(100分)

  • 主题发起人 主题发起人 zwh
  • 开始时间 开始时间
Z

zwh

Unregistered / Unconfirmed
GUEST, unregistred user!
我想创建自定义文件头的文件,不知哪位大虾能告知在
DELPHI下如何实现 ?
 
不好意思,我的E.MAIL地址已经改为:
TDLZOUWANHE@188.NET
 
我这有个判断是否为EXE的例子,里面关于如何读写二进制
流讲的很清楚,你可以写一个链表的数据结构,把你要求的
头放进去,然后写到二进制流里面.
<P>将文件头读进来,判断否否Exe </P>
<P>offset(0) -$5a45 'MZ'</P>
<P>offset($80) = 'PE' WIN32 EXE</P>
<P>offset($100) = 'NE' WIN16 EXE</P>
<P> </P>
<P> e_magic:SmallInt</P>
<P> buffer:array[0..255] of byte;</P>
<P> FStream:TFileStream;</P>
<P> </P>
<P> FStream:=TFileStream.Create(Filename,fmOpenRead+fmShareDenyNone);</P>
<P> Try</P>
<P> FStream.Read(buffer,256);</P>
<P> if SmallInt(buffer[0]) <>$5A4D then</P>
<P> FIsMSDos:=False</P>
<P> else</P>
<P> FIsMSDos:=True;</P>
<P> </P>
<P> nPos:=$80 </P>
<P> </P>
<P> if (buffer[nPos+0]='P') and (buffer[nPos+1]='E') and (buffer[nPos+2]=#0) and (buffer[nPos+3]=#0) then</P>
<P> FIsPE:=True;</P>
<P> </P>
<P> finally</P>
<P> FStream.Free;</P>
<P> </P>
<P> nPos:=$100 </P>
<P> if (buffer[nPos+0]='N') and (buffer[nPos+1]='E') then</P>
<P> FIsNE:=True;</P>
<P> </P>
<P> </P>
<P> </P>
自定义文件头,还不如直接利用数据库方便,把你想用二进制
储存的内容用B不就行了吗 :)
 
忘了告诉你在流中使用特殊的数据类型药用
TReader与TWriter类
 
还是没太明白"自定义文件头"是什么意思。
 
例子如下:
unit abc;

interface

const
DRV_LOAD = $0001;
DRV_ENABLE = $0002;
DRV_OPEN = $0003;
// ......

type

function CloseDriver(hDriver: HDRVR; lParam1, lParam2: Longint): Longint; stdcall;
function OpenDriver(szDriverName: PWideChar; szSectionName: PWideChar; lParam2: Longint): HDRVR; stdcall;
// ......

implimentation

function CloseDriver; external 'winmm.dll' name 'CloseDriver';
function OpenDriver; external 'winmm.dll' name 'OpenDriver';
// .......

end.
 
最简单的办法是将整个文件头定义成一个record类型, 再定义一个stream,读入的时
候用stream.read:

type
TMeHeader=record
Mark: array [0..12] of char; //使用定长字符数组代替不定长的string
....
end;

TMyStream = class( TMemoryStream)
public
constructor Create( const FName: string; mode: integer);
function Read(var Buffer; Count: Longint): Longint; override;
end;

procedure readHeader;

var
MyHeader: TMyHeader;
MyStream: TMyStream;

implementation

constructor TMyStream.create(const fname: string; mode: integer);
begin
Inherited create;
if mode=0 then LoadFromFile(fName);
end;

function TMyStream.Read(var Buffer; Count: Longint): Longint;
var Msg: TMsg;
begin
//为了避免读操作占用全部CPU资源, 使用消息转发机制
while PeekMessage(Msg,0,0,0,PM_REMOVE) do
begin
if Msg.Message = WM_QUIT then halt(Msg.wParam);
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
result:=inherited read(Buffer,count);
end;

procedure readHeader;
begin
MyStream.read(MyHeader, sizeof(header));
end;

如果要读写不定长的记录, 可以将其声明称一个class, 然后使用TReader,TWriter
 
谢谢各位的热情帮助,小弟感激不尽!
 
后退
顶部