2010-04-21 88 views
2

我想检查文件是否具有有效的IMAGE_DOS_SIGNATURE(MZ)是否有效IMAGE_DOS_SIGNATURE

function isMZ(FileName : String) : boolean; 
var 
Signature: Word; 
fexe: TFileStream; 
begin 
result:=false; 
try 
    fexe := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone); 
    fexe.ReadBuffer(Signature, SizeOf(Signature)); 
    if Signature = $5A4D { 'MZ' } then 
    result:=true; 
finally 
fexe.free; 
end; 
end; 

我知道我可以使用一些代码在Windows单元检查IMAGE_DOS_SIGNATURE。问题是我想最快的方式检查IMAGE_DOS_SIGNATURE(对于一个大文件)。我需要你对我的代码或者一个新的代码的建议?

感谢

+0

将数据从磁盘传输到内存将是最大的瓶颈。优化它,并在以后担心其他瓶颈。您已经非常优化:只在每个文件的开头读取2个字节。 – 2010-04-21 11:44:48

回答

4

文件的大小并不重要,因为你的代码只读取前两个字节。

从分配和使用TFileStream任何开销,它通过SysUtils.FileRead去达到的Win32 ReadFile之前,应该是几乎看不到的噪音相比,唯一的形势寻求的成本,它应该没关系,在那里你通过扫描数百个可执行文件。

通过使用原始的WinAPI调整Windows的缓存可能会有一些好处,但我希望它是非常边缘的。

+0

是的,我想扫描数百个可执行文件,所以我正在寻找快速代码。 好吧,你是对的SizeOf(签名)的价值是2.你能解释为什么值为2,因为Signature的价值尚未宣布? – 2010-04-21 07:09:13

+1

'SizeOf(Signature)'是2,因为Signature已被声明为'word',而'word'的大小是16位,即2个字节。 – 2010-04-21 07:59:55

+0

谢谢。最后一个问题,如果FileName的文件大小为零,我得到“流读取错误”。我可以通过使用try除了处理这个问题。是否有任何内部方法知道Fexe会导致错误? – 2010-04-21 08:45:09