2008-12-26 6 views
4

J'aimerais pouvoir verrouiller l'accès au répertoire sous Windows. Les travaux de code suivant grandement avec le fichier ou un répertoire sous système POSIX:Python: Verrouiller l'accès au répertoire sous Windows

def flock(fd, blocking=False, exclusive=False): 

    if exclusive: 
     flags = fcntl.LOCK_EX 
    else: 
     flags = fcntl.LOCK_SH 
    if not blocking: 
     flags |= fcntl.LOCK_NB 
    fcntl.flock(fd, flags) 

Mais je trouve seulement un moyen d'effectuer de verrouiller l'accès pour le fichier, pas le répertoire avec le code suivant:

def flock(fd, blocking=False, exclusive=False): 

    if blocking: 
     flags = msvcrt.LK_NBLCK 
    else: 
     flags = msvcrt.LK_LOCK 
    msvcrt.locking(fd.fileno(), flags, os.path.getsize(fd.name)) 

Avez-vous eu une idée de comment améliorer ce code et être capable de verrouiller l'accès au répertoire?

Bertrand

Répondre

0

Vous pouvez probablement faire quelque chose comme ceci pour verrouiller indirectement un répertoire avec cette dernière fonction de troupeau.

for file in os.listdir(dir): 
f = open(file) 
flock(f) 

Ceci est une version limitée, puisque l'utilisateur sera en mesure de créer de nouveaux fichiers dans le répertoire.

0

Oui, vous avez raison, au moins, je peux essayer de verrouiller tous les fichiers du répertoire, mais cela peut être douloureux parce que j'ai besoin de marcher dans tous les sous-répertoires de mon répertoire. Dans le système POSIX, c'est facile parce que les répertoires sont considérés comme des fichiers, donc pas de problème avec ça. Mais dans Windows quand j'essaye d'ouvrir un répertoire, ça n'aime pas vraiment ça.

open(dirname) 

soulève exception:

OSError: [Errno 13] Permission denied: dirname 

Je ne suis pas vraiment sûr que ma solution est en fait la bonne façon de le faire.

1

Je ne crois pas qu'il soit possible d'utiliser flock() sur les répertoires dans Windows. PHPs docs sur flock() indique qu'il ne fonctionnera même pas sur les systèmes de fichiers FAT32. D'autre part, Windows a déjà tendance à ne pas vous permettre de supprimer des fichiers/répertoires si des fichiers sont encore ouverts. Ceci, plus peut-être en utilisant intelligemment les ACL, pourrait vous donner une solution équivalente à 95%.

Questions connexes