Comment vérifier si un fichier a été ouvert par une autre application en C++?
Je sais, qu'il y a de la is_open()
fonction en C++, mais je veux un programme pour vérifier si un fichier n'a pas été ouvert par une autre application. Est-il possible de le faire en utilisant la bibliothèque standard?
MODIFIER Précisé dans les réponses que c'est pour une application Linux.
OriginalL'auteur | 2009-06-26
Vous devez vous connecter pour publier un commentaire.
Pas, de la bibliothèque standard n'a pas cette fonctionnalité.
OriginalL'auteur
Non seulement de la bibliothèque standard ne dispose pas de cette fonctionnalité, il n'est même pas possible en général. Vous pouvez (sur linux) vérifier
/proc/*/fd
— mais il est possible que votre programme n'a pas l'autorisation de le faire sur les processus des autres utilisateurs (c'est la valeur par défaut dans Ubuntu, par exemple).OriginalL'auteur CesarB
Si vous contrôlez l'autre processus (code source), le mieux est de se consultatif sur l'utilisation de verrous dans les deux processus. Ce verrouillage est défini dans la norme POSIX, et sera portable sur différents systèmes d'exploitation.
Dans Linux, vous pouvez utiliser l'utilitaire lsof pour voir quels fichiers sont ouverts par d'autres processus.
C'est limité à ce que vous disposez des autorisations pour - que vous avez à faire le chèque comme un utilisateur privilégié, ou vous n'obtiendrez que des résultats pour les dossiers ouverts par le même utilisateur que celui qui fait le chèque.
Je ne connais que de l'utilitaire de ligne de commande, pas de tout système d'appel vous pouvez utiliser directement à partir du code C.
Dans Linux, il est aussi possible de faire une obligatoire de verrouillage pour un système de fichiers donné (mount-o mand), et de définir des indicateurs sur le fichier (chmod g-x,g+s). Puis, quand votre processus tente d'acquérir un verrou en écriture, ce sera un échec si un autre processus a ouvert le fichier. Ce n'est presque jamais utilisé, mais si vous contrôlez entièrement le système en question, il peut être une option.
Je vous suggère de l'aide de l'unité de fusion de plus de lsof. L'analyse des résultats sera beaucoup plus simple.
OriginalL'auteur jmanning2k
Le code suivant peut travailler.
OriginalL'auteur tinytaro
vous pourriez peut-être juste essayer et obtenir un verrou d'écriture? Il va échouer si quelqu'un d'autre l'a ouvert pour la lecture ou l'écriture.Si ce n'est pas de la croix-plate-forme et est Win32, vous pouvez demander encore plus fine d'écluses.
Voir ici
et regardez
dwShareMode
, la valeur de 0, ainsi que les autres paramètres.OriginalL'auteur Pod
Nope. Sauf si une autre application utilise consultatif de serrures.
Voir http://docs.sun.com/app/docs/doc/816-0213/6m6ne37v5?a=view
OriginalL'auteur Eugene Bujak
Non-natif, il pouvait demander à Sysinternals' handle.exe comme un dernier recours...
OriginalL'auteur ZombieSheep
@Neil Butterworth dit, de la bibliothèque standard ne marche pas.
Dans unix, vous pouvez utiliser fcntl d'utiliser des verrous de fichier.
Vous pourriez écrire un wrapper pour votre fonction open, qui vérifie la présence d'un verrou (et des serrures s'il n'en existe) d'un fichier ouvert par personne d'autre. Vous shold écrire un wrapper pour les proches, qui libère le verrou sur le fichier proche.
OriginalL'auteur Tom
Dans Windows ce petit et sale astuce fonctionne (si le fichier existe et que vous avez les autorisations de droite)
Il est susceptible de travailler sous Linux aussi.
: )
Sous linux, vous pouvez renommer le fichier alors qu'il est ouvert. Les fichiers sont suivis par inode, pas de nom. Vous pouvez même supprimer le fichier, et le processus qui l'a ouvert continuerai à le lire sans erreurs.
merci pour l'info. Très intéressante.
Dans l'Explorateur, vous pouvez aussi renommer les fichiers qui ne peuvent pas être supprimés car ils sont verrouillés. Très utile lorsque vous souhaitez copier les fichiers de plus de ceux déjà existants, et ne peut pas remplacer un fichier verrouillé.
OriginalL'auteur Nick Dandoulakis