2016-06-15 50 views
5

Там в сценарий, чтобы заново создать папку:Как избежать «WindowsError: [Ошибка 5] Доступ запрещен»

# Remove folder (if exists) with all files 
if os.path.isdir(str(os.path.realpath('..') + "\\my_folder")): 
     shutil.rmtree(os.path.realpath('..') + "\\my_folder", ignore_errors=True) 
# Create new folder 
os.mkdir(os.path.realpath('..') + "\\my_folder") 

Это работает почти всегда, но в некоторых случаях (на стадии создания) Я получаю

WindowsError: [Error 5] Access is denied: 'C:\\Path\\To\\my_folder' 

Что может вызвать эту ошибку и как ее избежать?

+0

проверить это: http://stackoverflow.com/questions/12990112/how-to-remove-folder-in-python-rmtree-onerror – Netwave

ответ

1

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

6

Что может вызвать эту ошибку?

У вас просто нет доступа к папке, в которой вы пишете, для текущего процесса (python.exe) или, возможно, даже для пользователя. Если ваш пользователь не является администратором, могут быть каталоги, для которых у вас нет прав на запись.


Как этого избежать?

В целом, чтобы избежать такого исключения, можно было бы использовать блок try и except, в этом случае было бы IOError. Поэтому, если вы просто хотите упустить Отказано в доступе и продолжить со сценарием вы можете попробовать:

try: 
    # Remove folder (if exists) with all files 
    if os.path.isdir(str(os.path.realpath('..') + "\\my_folder")): 
     shutil.rmtree(os.path.realpath('..') + "\\my_folder", ignore_errors=True) 
    # Create new folder 
    os.mkdir(os.path.realpath('..') + "\\my_folder") 
except IOError: 
    print("Error upon either deleting or creating the directory or files.") 
else: 
    print("Actions if file access was succesfull") 
finally: 
    print("This will be executed even if an exception of IOError was encountered") 

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

  • Пользователь, который может выполнять программы в качестве администратора:Вариант A

    1. Щелкните правой кнопкой мыши на cmd.exe.
    2. Кликните на Запуск от имени администратора.
    3. Перейдите к месту своего сценария через cd, так как он будет открыт по адресу C:\Windows\system32, если вы не отредактируете определенные параметры.
    4. Запустите свой скрипт > python myscript.py.
  • Пользователь, который может выполнять программы в качестве администратора:Вариант B

    1. Открыть файл эксплорер.
    2. Перейти к папке или папкам, в которые вы хотите написать.
    3. Щелкните правой кнопкой мыши по нему.
    4. Выберите Свойства.
    5. В окне свойств выберите вкладку безопасности.
    6. Нажмите «Изменить» и отредактируйте его по своему усмотрению или необходимо предоставить доступ к программам или пользователям.
  • Пользователь без каких-либо привилегий администратора:

    1. Это, вероятно, означает, что это не ваш компьютер.
    2. Обратитесь в службу поддержки ПК, если в Uni или Work, или спросите своего учителя, если в школе.
    3. Если вы находитесь дома, и это ваш компьютер, это означает, что вы вошли в систему с пользователем, не являющимся администратором. По умолчанию вы создаете первый. Если да, проверьте настройки пользователя на панели управления.
    4. Оттуда на остальном почти то же самое потом.
+0

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

+0

Я столкнулся с той же проблемой, и это определенно не проблема с разрешениями.Если я поставлю несколько секунд сна между rmtree и mkdir, он будет работать каждый раз, но если я сделаю mkdir, то он немедленно сработает. – Emma

+0

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

4

Права доступа могут быть проблемы, но у меня была та же проблема «[Error 5] Доступ запрещен» на os.rename() и простой повтор петли удалось переименовать файл после нескольких попыток.

for retry in range(100): 
    try: 
     os.rename(src_name,dest_name) 
     break 
    except: 
     print "rename failed, retrying..." 
5

См. Документацию по RemoveDirectory; «Функция RemoveDirectory отмечает каталог для удаления при закрытии. Поэтому каталог не удаляется, пока последний дескриптор в каталог не будет закрыт».

Это означает, что если что-то удается создать дескриптор каталога удалить (между созданием и удалением), то директория на самом деле не удаляется, и вы получите ваш «Access Denied»,

Чтобы решить это переименование каталог, который вы хотите удалить, прежде чем удалять его.

Так

while True: 
    mkdir('folder 1') 
    rmdir('folder 1') 

может потерпеть неудачу, решить с;

while True: 
    mkdir('folder 1') 
    new_name = str(uuid4()) 
    rename('folder 1', new_name) 
    rmdir(new_name) 
+0

Проблема не актуальна, поэтому я не могу ее проверить. Но я уверен, что это должно работать – Andersson

+0

Я могу подтвердить, что этот трюк сработал. Интересно, что после вызова rmdir я использовал os.path.exists(), чтобы проверить, была ли папка успешно удалена, прежде чем пытаться ее воссоздать. Несмотря на то, что os.path.exists (path) возвращал False, я все еще получал ошибку «Доступ лишен» при запуске os.mkdir (path). – Emma

1

Создайте свой файл сценария python. В этом случае вы можете скопировать его в C: \ WINDOWS \ system32. Файл сценария создает папку с именем «Smaog»

import os 
os.chdir('C:/Program Files') 
os.makedirs('Smaog') 

Создайте командный файл в любой папке, которая вам нравится.

echo off 
title Renaming Folder 
python sample.py 
pause 

Сохраните пакетный файл. Чтобы запустить его, щелкните правой кнопкой мыши и выберите «Запуск от имени администратора»

Хотя вы можете сделать это вместо этого, если не хотите, чтобы ваш скрипт python помещался в C: \ WINDOWS \ system32. В своем пакетном файле укажите папку/каталог, в котором находится ваш файл сценария python.

echo off 
title Renaming Folder 
cd c:\Users\Smaog\Desktop 
python sample.py 
pause 

Затем запустите его как администратор, как описано выше.

Смежные вопросы