8
votes

Comment puis-je dire si un fichier est un descendant d'un répertoire donné?

Sur la surface, c'est assez simple et je pourrais la mettre en œuvre moi-même facilement. Il suffit d'appeler successivement DirName () pour monter chaque niveau dans le chemin du fichier et vérifier chacun pour voir s'il s'agit du répertoire que nous recherchons.

Mais les liens sympathiques jettent le tout dans le chaos. Tout répertoire situé dans le chemin du fichier ou du répertoire en cours de répertoire pourrait être un lien symbolique, et tout lien symbolique pourrait avoir une chaîne arbitraire de symboles de liens avec d'autres symboles. À ce stade, mon cerveau fait fondre et je ne suis pas sûr de quoi faire. J'ai essayé d'écrire le code pour gérer ces cas spéciaux, mais cela devient bientôt trop compliqué et je suppose que je le fais mal. Y a-t-il un moyen raisonnablement élégant de faire cela?

J'utilise Python, donc toute mention d'une bibliothèque qui cela serait cool. Sinon, c'est un joli problème neutre de la langue.


0 commentaires

3 Réponses :


10
votes

Utilisez OS.PATH.REALPATH code> et OS.Path.COMMONMONPREFIX CODE> :

os.path.commonprefix(['/the/dir/', os.path.realpath(filename)]) == "/the/dir/"


3 commentaires

Peut-être que les cas de bord sont tous dans ma tête. Je pourrais jurer que les liens symboliques font que cette approche échoue dans certains cas, mais je ne peux pas proposer des exemples pour le prouver. J'ai l'impression de me battre un fantôme ...


Étant donné que chaque système de fichiers hiérarchique, je peux penser nécessite un seul, unique, canonique, véritable annuaires nommés, cela fonctionne réellement. Bien que cela puisse être contre-intuitif que vous puissiez obtenir d'ici là, pour les annuaires, le "un vrai parent" doit être vrai ou que de mauvaises choses s'ensuivent.


Eh bien, c'est une bonne nouvelle d'entendre ça. Maintenant, j'ai juste besoin de vérifier quatre cas (realpath et non realpath pour direct et fichier). Merci!



3
votes

Python 3.5 a la fonction utile OS .Path.comMonPath :

Renvoie le plus long sous-chemin commun de chaque chemin de chemin dans les chemins de séquence. Soulevez ValueError si les chemins contiennent des noms chemins absolus et relatifs, ou si des chemins sont vides. Contrairement à CommonPrefix () , cela renvoie un chemin valide.

Pour vérifier si un fichier est un descendant d'un répertoire, vous pouvez le faire: xxx

contrairement à commonprefix , Vous n'avez pas besoin de vous inquiéter si les intrants ont des barres obliques ou non. La valeur de retour de commonprefix manque toujours d'une barre oblique de fin.


0 commentaires

1
votes

Une autre façon de faire cela dans Python 3 est d'utiliser pathlib : xxx

voir la documentation pour chemin.Resolve () et chemin.parents .


0 commentaires