2017-01-17 1 views
1

J'ai un problème lors de l'exécution d'une méthode qui calcule les sommes de contrôle MD5 et SHA1 pour un fichier donné. Mes méthodes ressemblent à ceci:
SHA1:IOException lors du calcul des sommes de contrôle MD5 et SHA1

public string HashFile(string toHash) 
    { 
     SHA1 SHA1ENGINE = SHA1.Create(); 
     byte[] hashBytes = SHA1ENGINE.ComputeHash(File.Open(toHash, FileMode.Open, FileAccess.Read)); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < hashBytes.Length; i++) 
     { 
      sb.Append(hashBytes[i].ToString("X2")); 
     } 
     return sb.ToString(); 
    } 


MD5:

public string HashFile(string toHash) 
    { 
     MD5 MD5ENGINE = MD5.Create(); 
     byte[] hashBytes = MD5ENGINE.ComputeHash(File.Open(toHash, FileMode.Open, FileAccess.Read)); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < hashBytes.Length; i++) 
     { 
      sb.Append(hashBytes[i].ToString("X2")); 
     } 
     return sb.ToString(); 
    } 


Lors de l'exécution d'une de ces méthodes, je reçois un IOException: Le processus ne peut pas accéder au fichier « (PATHTOFILE) 'parce qu'il est utilisé par un autre processus.
Ceci est un problème persistant, je ne peux pas calculer les sommes de contrôle pour un fichier sur mon PC. Je suis connecté en tant qu'administrateur local et VS est ouvert en tant qu'administrateur. Ceci est persistant pour tout répertoire que j'ai essayé par exemple: C: \ TEMP, C: \ Users \ Administrator \ Desktop. J'ai également essayé de redémarrer mon PC, car il pourrait effectivement y avoir un processus qui verrouille les fichiers, mais cela n'a pas aidé.

Au début, j'ai essayé d'utiliser:

byte[] hashBytes = SHA1ENGINE.ComputeHash(File.OpenRead(toHash)); 

Mais après avoir rencontré le problème décrit et une enquête que j'ai changé que pour:

byte[] hashBytes = SHA1ENGINE.ComputeHash(File.Open(toHash, FileMode.Open, FileAccess.Read)); 

Cela aussi n'a pas aidé.

+0

'File.Open()' renvoie quelque chose qui doit être éliminé. – CodeCaster

+0

Vous devez utiliser une instruction using sur file.open https://msdn.microsoft.com/en-us/library/b9skfh7s(v=vs.110).aspx – JOSEFtw

Répondre

6

Vous ouvrez le fichier sans le fermer. Il suffit d'ouvrir le flux séparément de sorte que vous pouvez le fermer dans un communiqué using:

MD5 md5 = MD5.Create(); 
using (var stream = File.Open(...)) 
{ 
    var hash = md5.ComputeHash(stream); 
    // ... 
} 

(Je voudrais aussi séparer le suggère code « convertir en hexadécimal » pour éviter les doubles emplois Vous pourriez même avoir une méthode de prendre un nom de fichier. et un HashAlgorithm pour éviter les doubles emplois encore plus loin ...)

cela évitera votre code maintenant les flux de fichiers ouverts qui empêcheront le code d'ouvrir un autre flux de fichiers (y compris le même processus) ... mais il ne sera pas utile pour toute mouche qui est actuellement ouverte ailleurs. Si vous ne pouvez pas ouvrir le fichier pour le lire, vous ne pourrez tout simplement pas calculer le hachage.

+0

L'instruction 'using' a effectivement aidé mais pas entièrement. Je suis toujours coincé sur certains fichiers. –

+0

@PiotrTruszkowski: Eh bien, peut-être que ces fichiers * sont * ouverts dans d'autres applications? Si vous ne pouvez simplement pas ouvrir le fichier, il n'y a pas grand-chose à faire ... –

+0

merci pour l'info. Je vais juste marquer le fichier comme _locked_, devrait faire l'affaire ... –