Python: блокировка доступа к каталогу под windows - PullRequest
5 голосов
/ 27 декабря 2008

Я бы хотел иметь возможность заблокировать доступ к каталогу под Windows. Следующий код прекрасно работает с файлом или каталогом в системе POSIX:

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)

Но я нахожу только способ блокировки доступа к файлу, а не к каталогу со следующим кодом:

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))

Есть ли у вас какие-либо идеи по улучшению этого кода и возможности блокировки доступа к каталогу?

Bertrand

Ответы [ 3 ]

1 голос
/ 27 декабря 2008

Я не верю, что возможно использовать flock () для каталогов в Windows. Документы PHP для flock () указывают, что он даже не будет работать в файловых системах FAT32.

С другой стороны, Windows уже имеет тенденцию не разрешать вам удалять файлы / каталоги, если какие-либо файлы все еще открыты. Это, плюс, возможно, интеллектуальное использование ACL, может дать вам 95% эквивалентное решение.

0 голосов
/ 27 декабря 2008

Да, вы правы, по крайней мере, я могу попытаться заблокировать каждый файл каталога, но это может быть болезненно, потому что мне нужно пройти по всем подкаталогам моего каталога. В системе POSIX это легко, потому что каталоги выглядят как файлы, поэтому проблем с этим нет. Но в Windows, когда я пытаюсь открыть каталог, это не очень нравится.

open(dirname)

повышает исключение:

OSError: [Errno 13] Permission denied: dirname

Я не совсем уверен, что мое решение - действительно хороший способ сделать это.

0 голосов
/ 27 декабря 2008

Вы, вероятно, можете сделать что-то подобное, чтобы косвенно заблокировать каталог с помощью последней функции flock.

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

Это ограниченная версия, поскольку пользователь сможет создавать новые файлы в каталоге.

...