Fichier.Ouvert pour les accès en lecture refusé sur l'exécution de fichier dans Windows
J'ai un problème avec les autorisations de fichier sur l'exécution de fichiers de Windows, qui semble être résolu après à la suite d'un forum de la pointe[1], mais je ne comprends pas pourquoi. Peut-être que vous les gars peut vous aider.
Je vérifie la bannière d'un fichier, en l'exécutant (la lecture de la sortie de la console), puis d'ouvrir le même fichier pour la lecture par la suite à l'aide de FileStream:
public void fileMD5(string filename) {
if (!File.Exists(filename)) return NT.Fail("File does not exist: " + filename);
BinaryReader stream = new BinaryReader(File.Open(filename,
FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];
int readBytes;
while ((readBytes = stream.Read(buffer, 0, bufferSize)) > 0) {
md5Hasher.TransformBlock(buffer, 0, readBytes, buffer, 0);
}
stream.Close();
}
fileMD5('sample.exe');
et à chaque fois dans un certain temps, je voudrais obtenir de fichier est utilisé par un autre processus". À partir de Wikipedia, je sais que Windows va définir un verrouillage de l'exécution de fichiers de nier l'accès en écriture[2], mais je suis seulement en lecture. Aussi, le processus devrait avoir arrêté déjà quand j'essaie de l'ouvrir.
Du post sur le forum, il semblerait que l'ajout d'un partage de fichiers.ReadWrite voulez aider et il semble qu'Il n':
FileStream stream = File.Open('sample.exe',
FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
Mais je ne comprends pas pourquoi. Est-il une condition de concurrence ici que je ne vois pas?
Également le Fichier.Appel ouvert semble être beaucoup plus rapide avec FileShare.ReadWrite au lieu de la valeur par défaut (qui je suppose est FileShare.Lire).
[1] http://www.xtremevbtalk.com/archive/index.php/t-192118.html
[2] http://en.wikipedia.org/wiki/File_locking#In_Microsoft_Windows
Vous attendez sample.exe pour la sortie je suppose?
vous devez fermer le flux de données par rapport aux versions précédentes
Il n'y a aucun précédent poignées pour le fichier, mais plus de code fourni, de toute façon. Et je ne attendre sample.exe à la sortie, oui.
Pensez-vous à l'aide de Win7 ?
OriginalL'auteur Vegar Westerlund | 2011-08-10
Vous devez vous connecter pour publier un commentaire.
Lorsque vous ne spécifiez pas de partage de fichiers de paramètre par défaut pour cette option est FileShare.Aucun, en fait le code dans le Fichier de classe exécute simplement ceci:
En ce qui concerne la performance, je peux seulement imaginer que la spécification de partage de fichiers.ReadWrite signifie que Windows n'a pas besoin d'acquérir un verrou sur le fichier.
Aussi loin que le fichier est utilisé par un autre processus" d'erreur que vous obtenez ce problème en aller si vous enroulez l'utilisation du flux variable à l'intérieur d'une aide de bloc de sorte que le Flux devient éliminés dès que vous avez terminé?
Ha, la piste de la solution était en fait dans la question: "qui je suppose est FileShare.Lire". Vous ne devez jamais deviner dans la programmation et lowds a souligné la valeur par défaut est en fait FileShare.Aucun. Pour un MD5 vérifier qu'il est d'accord pour permettre à d'autres de les lire donc je devrais être spécifique à ce sujet. La mise en œuvre correcte devrait être: Fichier.Open('sample.exe', FileMode.Open, FileAccess.Lire, FileShare.Lecture);
OriginalL'auteur lowds
Vous devez fermer votre FileStream et puis, ensuite, ouvrez un nouveau FileStream.
FileShare est nécessaire lorsque les applications souhaitez partager un fichier n'est pas seulement une application ou une application a plusieurs lecteurs ou écrivains en même temps.
Pourquoi? C'est gênant quand tout le monde peut lire et écrire en même temps. Dans ce cas, vous devriez mieux explicitement définie de sorte que son évident que sa se salissant. 🙂
Il sera toujours verrouiller le fichier lorsque vous lisez ou écrivez lorsque vous définissez FileShare.Aucun.
OriginalL'auteur Skomski
Qu'il a à faire avec le sous-jacent windows API CreateFile drapeaux.
Voir http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx
pour une vue d'ensemble,
http://blogs.msdn.com/b/larryosterman/archive/2004/05/13/131263.aspx
pour en savoir plus sur la manière NT (et les suivantes), la charge de la execs avec FILE_SHARE_DELETE
Et surtout cette
http://blogs.msdn.com/b/oldnewthing/archive/2004/05/11/129759.aspx
Pour une grande explication sur la façon dont l'autorisation de partage et d'accès souhaité composer ensemble!
OriginalL'auteur Lorenzo Dematté
Il semble que la spécification d'un mauvais partage de fichiers peut vous interdire d'accéder à un fichier. Si vous spécifiez
FileShare.Read
mais une autre application a actuellement accès en écriture à ce fichier, vous ne pouvez pas accéder au fichier depuis votre FileShare.Lire n'est actuellement pas satisfaisante. FileShare.ReadWrite est moins restrictive, car il est plus facile satisfiable. Source: http://blogs.msdn.com/b/oldnewthing/archive/2004/05/11/129759.aspxOriginalL'auteur user1182735