2010-04-21 90 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