Python: заблокировать доступ к каталогу под окнами

Я хотел бы иметь возможность заблокировать доступ к каталогу под окнами. Следующий код отлично работает с файлом или каталогом в системе 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))

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

Бертран


person Bertrand    schedule 26.12.2008    source источник


Ответы (3)


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

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

person HUAGHAGUAH    schedule 27.12.2008

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

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

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

person kylebrooks    schedule 26.12.2008

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

open(dirname)

вызывает исключение:

OSError: [Errno 13] Permission denied: dirname

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

person Bertrand    schedule 27.12.2008