2010-04-21 5 views
2

Je veux vérifier un fichier a un IMAGE_DOS_SIGNATURE valide (MZ)est valide 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; 

Je sais que je peux utiliser un code dans l'unité Windows pour vérifier la IMAGE_DOS_SIGNATURE. Le problème est que je veux le le moyen le plus rapide pour vérifier IMAGE_DOS_SIGNATURE (pour un gros fichier). J'ai besoin de votre suggestion sur mon code ou peut-être un nouveau code?

Merci

+0

Le transfert de données du disque vers la mémoire sera le plus gros goulot d'étranglement. Optimisez cela et inquiétez-vous des autres goulets d'étranglement plus tard. Vous êtes déjà plutôt optimal: ne lisez que 2 octets au début de chaque fichier. –

Répondre

4

La taille du fichier n'a pas d'importance parce que votre code ne lit que les deux premiers octets.

Tous les frais généraux de l'allocation et l'aide d'un TFileStream, qui passe par SysUtils.FileRead avant d'atteindre Win32 ReadFile, devrait être tout sauf le bruit invisible par rapport au coût de la recherche dans la seule situation où il devrait importer, où vous numérisez par des centaines d'exécutables.

Il pourrait être utile de modifier la mise en cache de Windows en utilisant le WinAPI brut, mais je m'attendrais à ce qu'il soit très marginal.

+0

Oui, je veux parcourir des centaines d'exécutables, donc je cherche le code rapide. Ok, vous avez raison la valeur de SizeOf (Signature) est 2. Pouvez-vous m'expliquer pourquoi la valeur est 2, parce que la valeur de Signature n'a pas été déclarée? –

+1

'SizeOf (Signature)' est 2 car la signature a été déclarée comme 'word' et la taille d'un' word' est de 16 bits, soit 2 octets. –

+0

Merci. dernière question, si la taille du fichier de FileName est zéro, j'ai "stream lecture error". Je peux gérer ce problème en utilisant essayer sauf. Existe-t-il une méthode interne pour savoir que fexe provoquera une erreur? –