12
votes

Comment vérifier si un fichier est déjà ouvert par un autre processus en C?

Je vois que la norme C n'a aucun moyen de dire si un fichier est déjà ouvert dans un autre processus. La réponse doit donc contenir plusieurs exemples pour chaque plate-forme. J'ai besoin de cette vérification pour Visual C ++ / Windows.


7 commentaires

Pourquoi voulez-vous savoir si un fichier est ouvert par un autre processus? De plus, voulez-vous savoir si le fichier est ouvert par un processus spécifique (c.-à-d.) Ou simplement ouvert par tout autre processus?


Juste si un autre processus accède déjà en même temps. Si le fichier est utilisé, je pourrais endommager quelque chose lorsque vous poursuivez.


Je ne suis pas intéressé par "quel" processus accède à des informations. Cette question est ici car personne d'autre semble répondre à cette question sur d'autres plates-formes, mais il pourrait être nécessaire de savoir que. Alors s'il vous plaît gardez-le court et ne dites pas de "penser" sur le problème. Pensez à EXPLORER, c'est comme si vous avez avant de retirer le fichier qu'il vérifie pour voir si un autre processus y est accessible.


Compte tenu de votre réponse, vous avez un problème de verrouillage de fichier et chaque plate-forme a des moyens bien définis de le faire. En ce qui concerne la réinterrigence du problème, je vais simplement noter que le remplacer de «Qui a le fichier ouvert» à «Comment puis-je verrouiller le fichier» est de repenser le problème et la modifie de très difficile dans un peu plus simple.


Pas la même application. Je modifie le fichier d'un autre processus.


"Chaque plate-forme"?!?!? Savez-vous combien de ceux-ci sont?


Découvrez quel processus verrouille un fichier ou un dossier sous Windows sur superutilisateur.


8 Réponses :


2
votes

Un tel contrôle serait intrinsèquement racé. Un autre processus pourrait toujours ouvrir le fichier entre le point où vous avez fait le chèque et le point où vous avez accédé au fichier.


0 commentaires

4
votes

Obtenir les informations Open_Files est difficile, c'est comme tirer les dents, et si vous n'avez pas besoin de besoin immédiat, vous ne devriez pas demander "plusieurs exemples pour chaque plate-forme", juste pour l'enfer. Juste mon avis, bien sûr.

Linux et de nombreux systèmes UNIX ont un utilitaire système appelé lsof qui trouve des poignées de fichier ouverte et des trucs. La façon dont il le fait est d'accéder à / dev / kmem , qui est un pseudo-fichier contenant une copie de la mémoire du noyau "en direct", c'est-à-dire le stockage de travail du noyau du système d'exploitation. Il existe des tables de fichiers ouverts là-bas, naturellement et la structure de mémoire est open-source et documentée. Il s'agit donc d'une question de beaucoup de tâches pour LSOF d'y aller, de trouver les informations et de le formater pour l'utilisateur. < / p>

La documentation pour les entrailles profondes de Windows, d'autre part, est pratiquement inexistante et je ne savais pas que les structures de données sont exposées en quelque sorte à l'extérieur. Je ne suis pas expert Windows, mais à moins que l'API Windows n'offre explicit ce type d'informations, il peut simplement ne pas être disponible.

Tout ce qui est disponible est probablement utilisé par les utilitaires Sysinternals de Mark Russinovich. Le premier qui me vient à l'esprit est le filon. En regardant ceux qui peuvent vous donner des indices. MISE À JOUR: Je viens d'être informé que Sysinternals poignées.exe est encore plus proche de ce que vous voulez.

Si vous parvenez à comprendre cela, bon; Sinon, vous pourriez être intéressé par la capture de fichiers ouverts / fermer les opérations tels qu'ils se produisent: l'API Windows offre une poignée généreuse de crochets dites: http://msdn.microsoft.com/en-us/library/ms997537.aspx . Les crochets vous permettent de demander une notification lorsque certaines choses se produisent dans le système. Je crois qu'il y en a un qui vous dira lorsqu'un programme -Systemwide- ouvre un fichier. Vous pouvez donc créer votre propre liste de fichiers ouverts pendant la durée que vous écoutez vos crochets. Je ne sais pas avec certitude mais je soupçonne que cela peut être ce que fait filemon.

L'API Windows, y compris les fonctions de crochet, on peut accéder à partir de C. SystemWide Hooks vous demandera de créer une DLL à charger à côté de votre programme.

J'espère que ces astuces vous aident à commencer.


1 commentaires

Il est possible de le faire dans Windows. L'outil Sysinternals Manipulals le fait, par exemple. TechNet.microsoft.com/en-us/sysinternernals/bb896655.aspx



8
votes

Il n'y a aucun moyen, à moins que l'autre processus n'interdit explicitement l'accès au fichier. Dans MSVC, vous le feriez avec _fsopen () , spécifiant _sh_denyrd pour l'argument shflag. La notion d'intérêt d'être intéressée si un fichier est ouvert qui n'est pas verrouillé autrement est profondément défectueux sur un système d'exploitation multitâche. Il pourrait être ouvert une microseconde après avoir trouvé que ce n'était pas. C'est aussi la raison pour laquelle Windows n'a pas de fonction isfilelocked ().

Si vous avez besoin d'un accès synchronisé aux fichiers, vous devez ajouter ceci avec un mutex nommé, utilisez Createmutex ().


1 commentaires

Merci. Pour Windows, cela fonctionne et a vraiment aidé mon problème. Le reste est que d'autres personnes cherchent une réponse à d'autres plates-formes.



0
votes

Les réponses jusqu'à présent devraient vous dire que la recherche des informations que vous avez demandées est délicate, non portable et souvent intrinsèquement peu fiable. Donc, de mon point de vue, la vraie réponse est ne fais pas cela . Essayez de trouver un moyen de penser à votre vrai problème afin que cette question ne se présente pas.


0 commentaires

10
votes

Windows: Essayez d'ouvrir le fichier en mode exclusif. Si cela fonctionne, personne d'autre n'a ouvert le fichier et ne pourra pas ouvrir le fichier xxx

ms dit: Dwsharemode

Le mode de partage d'un objet, qui peut être lu, écrire, à la fois, Supprimer, tous, ou aucun (reportez-vous au tableau suivant).

Si ce paramètre est zéro et Createfile réussit, l'objet ne peut pas être partagé et ne peut pas être ouvert à nouveau jusqu'à ce que la poignée soit fermée.

Vous ne pouvez pas demander un mode de partage en conflit avec le mode d'accès spécifié dans une demande ouverte qui a une poignée ouverte, car cela entraînerait la violation du partage suivant: error_sharing_violation.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx

Extension: Comment supprimer un système de fichiers de fichier (non réadonné) que personne n'a ouvert pour lire / écrire?

accès à droite fichier_read_attributes, non supprimé. Supprimer pourrait causer des problèmes sur SMB Partager (aux serveurs de Windows MS) - Createfile partira avec un fichier de fichier / périphérique / puits / MUP encore: XXX - Pourquoi jamais et quel que soit ce que ce mup est. Ne se produira pas avec accès à droite fichier_read_attributes Utilisez FILE_FLAG_OPEN_REPARSE_PORE sur Supprimer le nom de fichier. Sinon, vous supprimerez la cible d'un lien symbolique - qui n'est généralement pas ce que vous voulez xxx

Que faire avec un fichier ouvert? Si le fichier est ouvert et que vous êtes autorisé à faire un Dislink, vous serez laissé un fichier dans lequel on peut ouvrir une ouverture conduira à Access_denied. Si vous avez un dossier temporaire, cela pourrait être une bonne idée de renommer (nom de fichier, tempdir / fichier nom.delete) et supprimer tempdir / fichier nom.delete.


0 commentaires

0
votes

Cela ne peut pas être si dur.

Faites ceci: P>

try{
File fileout = new File(path + ".xls");
FileOutPutStream out = new FileOutPutStream(fileout);
}
catch(FileNotFoundException e1){

 // if a MS Windows process is already using the file, this exception will be thrown
}
catch(Exception e){

}


2 commentaires

Vrai, lol whoops désolé


Quelle "version" de C ++ utilisez-vous?



4
votes

Pour Windows, ce code fonctionne également:

boolean isClosed(File f) { return f.renameTo(f); }


2 commentaires

Cela fonctionne pour moi et est très simple à mettre en œuvre! C'est en Java plutôt que C, ce qui est peut-être pour la raison pour laquelle vous avez été évité. J'ai trouvé cette réponse extrêmement utile, merci.


Quelle bibliothèque utilisez-vous vers l'action de renommée ?, Parce que si j'essaie de renommer le fichier avec std :: renommé , Windows permet de renommer le fichier bien qu'il soit ouvert.



0
votes

Vous pouvez utiliser quelque chose comme ça. Ce n'est pas une solution appropriée. Mais cela fonctionne, xxx


0 commentaires