VB.Net 3.5 Vérifier si le fichier est en cours d'utilisation
J'ai un programme de mise à jour qui est totalement indépendant de ma principale de l'application. Je lance le update.exe pour mettre à jour le app.exe. De vérifier pour voir si le fichier est en cours d'utilisation, je le déplacer vers un autre fichier et attraper une erreur si elle est en cours d'utilisation. Si pas de problèmes occurr je le renommer en arrière. Au moins c'était mon plan...
Programme principal: app.exe
Programme de mise à jour: update.exe
Ce programme est utilisé sur le réseau sans services en cours d'exécution. Ainsi, les utilisateurs est littéralement en exécutant l'exe sur le réseau sur leur machine.
J'ai besoin de mettre à jour le app.exe lorsque l'update.exe a exécuter. De vérifier pour voir si le app.exe était encore en usage, j'étais emballage les éléments suivants dans un try/catch pour voir si elle a échoué:
IO.Fichier.Déplacer(upddir & "\app.exe", upddir & "\app.exe.tst")
IO.Fichier.Déplacer(upddir & "\app.exe.tst", upddir & "\app.exe")
Le plus drôle, c'est que, même si l'app.exe est en cours d'exécution, le déplacement pouvez le renommer à l'application.exe.tst sans aucune erreur. Je peux même continuer à l'application sans aucune erreur.
Je pensais que j'étais hors de mon esprit, j'ai donc eu un autre programmeur de regarder cela et il a vérifié ce que j'ai dit ci-dessus.
Nous avons donc essayé ce enveloppé dans un try catch:
Dim readfile Comme New FileStream(upddir & "\app.exe", FileMode.Open, FileAccess.Lire, FileShare.Aucun)
readfile.Dispose()
J'ai mis le partage de fichiers comme aucun de ceux qui, au moins, j'ai pensé qu'il serait, de montrer qu'il y avait quelqu'un dans le fichier.
Il continuait sans aucune erreur.
Ce que quelqu'un sait pourquoi, je peux renommer un fichier en cours d'utilisation?
Aussi, est-il une meilleure façon de le faire que ce que je fais maintenant?
Merci!
Eroc
- Vos tests ne seront efficaces que si le fichier à tester est ouvert avec droits exclusifs (ou d'autorisations d'écriture). Ce n'est généralement pas le cas avec les fichiers exécutables (sinon vous risquez de ne pas avoir C:\Program les Fichiers d'un dossier en lecture seule pour les utilisateurs normaux).
Vous devez vous connecter pour publier un commentaire.
Vous pouvez procéder de la façon suivante pour vérifier si l'application a d'autres instances en cours d'exécution:
Qui est plus approprié moyen de vérifier si l'application est en cours d'exécution.
Ont un coup d'oeil à Fichier.Déplacer la documentation MSDN. Il détaille ce que des exceptions sont levées. Vous êtes autorisé à renommer un fichier exe, même si elle est en cours d'Utilisation dans Vista.
Le même code à l'aide de "l'aide" 🙂
Ce que vous pourriez faire est de remplacer l'application cible avec un gardien exe.
Ce gardien puis génère l'application cible, mais crée également un fichier verrouillé dans un emplacement partagé. Le verrou est libéré et le fichier est supprimé lorsque l'application se ferme.
Puis, avant de mettre à jour le app.exe vous vérifiez existe-il des fichiers verrouillés dans l'emplacement partagé, si il y a des fichiers verrouillés, puis le app.exe est en cours d'utilisation.
Le gardien, le programme pourrait être une sans fenêtre de l'application, la console suivante app fait à peu près ce qu'il doit faire
La mise à jour puis recherche pour tous les "AppLock_*" les fichiers, et tente de les ouvrir avec un verrou en écriture, si il ne peut pas obtenir un verrou en écriture sur l'un d'eux, l'exe est en cours d'utilisation.
Espère que cette aide.
C'est ce que j'ai fait. La numérisation réseau ne fonctionne pas sur un réseau peer-to-peer. Il ne résout pas les autres ordinateurs du tout.
De toute façon, ici, il est:
Espère que cela aide la personne à côté de vous.