Как проверить, может ли файл быть создан в данной директории в MS XP / Vista?

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

Я создал каталог для тестовых целей, назовем его C:\foo .

У меня есть следующие разрешения для C:\foo :

  • Перемещение каталога / Выполнить файл
  • Удаление вложенных папок и файлов
  • Удаление
  • Разрешения на чтение
  • Изменить разрешения
  • Стать владельцем

У меня нет ни одного из следующих разрешений для C:\foo :

  • Полный контроль
  • Создание файла
  • Создание папок

Я уже пробовал следующие подходы:


os.access('C:\foo', os.W_OK) == True

st = os.stat ('C: \ foo')
mode = st [stat.ST_MODE]
mode & stat.S_IWRITE == Истина

Я считаю, что это вызвано тем фактом, что я могу переименовать папку, поэтому для меня это изменчиво. Но он доволен – нет.

Кто-нибудь знает, как я могу написать код, который будет проверять данный каталог, если у текущего пользователя есть разрешения на создание файла в этом каталоге?

Вкратце – я хочу проверить, есть ли у текущего пользователя разрешения на создание файлов и разрешения для папки для данного имени папки.

РЕДАКТИРОВАТЬ: Необходимость такого кода возникла из тестового примера № 3 из программы «Сертифицировано для Windows Vista», в котором говорится:

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

Если это понимать как «Приложение может попытаться сохранить файл в системном каталоге Windows, но не должно терпеть неудачу?» или, скорее, «приложение должно выполнить проверки безопасности перед попыткой сохранить файл?»

Должен ли я перестать беспокоиться только потому, что сама Windows Vista не позволит наименее привилегированному пользователю сохранять любые файлы в% WINDIR%?

    Недавно я написал приложение для передачи набора тестов для получения статуса ISV от Microsoft, и я также добавляю это условие. То, как я это понимал, заключается в том, что если пользователь является наименее Priveledge, тогда у него не будет разрешения на запись в системные папки. Поэтому я подошел к проблеме, как описал Ишмаил. Я пытаюсь создать файл и поймать исключение, а затем сообщить пользователю, что у него нет разрешения на запись файлов в этот каталог.

    По моему мнению, пользователь с наименьшей привилегией не будет иметь необходимых разрешений для записи в эти папки, если у него есть он, он не является пользователем с наименьшими привилегиями.

    Должен ли я перестать беспокоиться только потому, что сама Windows Vista не позволит наименее привилегированному пользователю сохранять любые файлы в% WINDIR%?

    По моему мнению? Да.

    Я не буду тратить время и LOC на проверку разрешений. Окончательный тест создания файла в Windows – это само создание. Другие факторы могут вступить в игру (например, существующие файлы (или, что еще хуже, папки) с тем же именем, дисковое пространство, фоновые процессы. Эти условия могут даже измениться между тем, как вы делаете начальную проверку, и временем, которое вы на самом деле пытаетесь создать файл.

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

    Я согласен с другими ответами, что способ сделать это – попытаться создать файл и поймать исключение.

    Однако на Vista остерегайтесь UAC! См. Например: «Почему мое приложение позволяет мне сохранять файлы в папках Windows и System32 в Vista?» : Чтобы поддерживать старые приложения, Vista будет «притворяться», чтобы создать файл, в то время как на самом деле он создает его в так называемом виртуальном магазине в профиле текущего пользователя.

    Чтобы этого избежать, вы должны конкретно указать Vista, что вам не нужны административные привилегии, включив соответствующие команды в манифест .exe, см. Вопрос, связанный выше.

     import os import tempfile def can_create_file(folder_path): try: tempfile.TemporaryFile(dir=folder_path) return True except OSError: return False def can_create_folder(folder_path): try: name = tempfile.mkdtemp(dir=folder_path) os.rmdir(name) return True except OSError: return False