OVH Cloud OVH Cloud

S_ISLNK et répertoire

7 réponses
Avatar
Jean-Baptiste Renard
Bonjour,

Je ne comprends pas le résultat du script suivant :
import os, sys
from stat import *

pathname = "/usr/share/icons/mdk-hicolor/normal"
mode = os.stat(pathname)[ST_MODE]
if S_ISLNK( mode ):
print "TEST LINK"
else:
print "TEST PAS LNK"
if S_ISDIR( mode ):
print "TEST DIRECTORY"
else:
print "TEST PAS DIR"

Lorsque je me lance, j'ai :
TEST PAS LNK
TEST DIRECTORY

or un ll me donne
#ls -l /usr/share/icons/mdk-hicolor/
total 4
-rw-r--r-- 1 root root index.desktop
lrwxrwxrwx 1 root root large -> /usr/share/icons/large/
lrwxrwxrwx 1 root root mini -> /usr/share/icons/mini/
lrwxrwxrwx 1 root root normal -> /usr/share/icons/

donc le script devrait afficher
TEST LINK
TEST PAS DIR

non ?

Du coup, je me retrouve avec une récursivité dans mon programme.
Toutes les explications pour expliquer mon erreur de raisonnement est la
bienvenu. (ainsi que sur la façon correcte de distingué un répertoire d'un
lien symbolique.)

7 réponses

Avatar
Jean-Baptiste Renard
Mon erreur est tellement basique qu'elle n'intêresse personne ?

Si j'ai mal expliqué mon problème, dites le moi, j'essayerais la prochaine
fois de m'appliquer.

Salutations
Avatar
Do Re Mi chel La Si Do
Bonsoir !

Désolé, mais, étant sous windows, je ne suis pas à même de comprendre ta
question. Alors, y répondre...

Mais j'espère que tu trouveras une solution.

@-salutations
--
Michel Claveau
Avatar
Vincent Bernat
OoO Pendant le repas du jeudi 27 janvier 2005, vers 19:11,
Jean-Baptiste Renard disait:

Je ne comprends pas le résultat du script suivant :
import os, sys
from stat import *

pathname = "/usr/share/icons/mdk-hicolor/normal"
mode = os.stat(pathname)[ST_MODE]


stat() suit les liens, il est donc normal qu'il t'indique qu'il ne
s'agit pas d'un lien. Il te faut utiliser lstat() si tu ne veux que
les liens soient suivis.
--
panic ("No CPUs found. System halted.n");
2.4.3 linux/arch/parisc/kernel/setup.c

Avatar
Jean-Baptiste Renard
Vincent Bernat wrote:

OoO Pendant le repas du jeudi 27 janvier 2005, vers 19:11,
Jean-Baptiste Renard disait:

Je ne comprends pas le résultat du script suivant :
import os, sys
from stat import *

pathname = "/usr/share/icons/mdk-hicolor/normal"
mode = os.stat(pathname)[ST_MODE]


stat() suit les liens, il est donc normal qu'il t'indique qu'il ne
s'agit pas d'un lien. Il te faut utiliser lstat() si tu ne veux que
les liens soient suivis.


Merci beaucoup, lstat était bien la solution au problème.


Avatar
Jean-Baptiste Renard
Do Re Mi chel La Si Do wrote:

Bonsoir !

Désolé, mais, étant sous windows, je ne suis pas à même de comprendre ta
question. Alors, y répondre...

Mais j'espère que tu trouveras une solution.

@-salutations
Ok, merci tout de même. Juste pour information la notion de lien "hard link"

existe sous windows, uniquement en NTFS mais ce n'est pas trop connu.

http://www.microsoft.com/resources/documentation/Windows/XP/all/reskit/en-us/Default.asp?url=/resources/documentation/Windows/XP/all/reskit/en-us/prkc_fil_baey.asp

Avatar
Do Re Mi chel La Si Do
Re !

Les liens NTFS, sous windows, sont liés au service "Client de suivi de lien
distribué". En théorie, ils permettent aussi des liens inter-machines, via
un réseau local. Mais, en pratique, on gagne en vitesse, en désactivant le
service. De plus, la gestion est assez particulière.


Enfin, je suis heureux que tu ais eu une solution.

Bonne nuit.
--
Michel Claveau
Avatar
jean-michel
"Jean-Baptiste Renard" a écrit dans le message de
news:41f92ebd$0$1994$
Toutes les explications pour expliquer mon erreur de raisonnement est la
bienvenu. (ainsi que sur la façon correcte de distingué un répertoire d'un
lien symbolique.)


Normalement, la commande 'stat' donne des infos sur un fichier; donc dans
ton cas, sur le fichier pointé par le lien.
Si tu veux des infos sur un lien symbolique, il faut utiliser la commande
'lstat'.
En ce moment, je n'ai pas d'unix sous la main; je ne peux donc pas vérifier,
mais ce devrait être pareil en python. 'os.lstat' devrait donner 'TEST
LNK/PAS DIR'
Pour faire la distinction, tu as 'islink' et 'isdir' qui devraient être plus
simple à utiliser. C'est ce que je prends, et je n'ai jamais eu de pb.
Exemple (non testé)
if isdir(pathname):
print 'DIR'
if islink(pathname):
print 'LINK'

++jm