Перезаписать каталог с помощью shutil.rmtree и os.mkdir иногда выдает ошибку "Доступ запрещен"



Мой код:



if os.path.exists(myDir):
shutil.rmtree(myDir)
os.mkdir(myDir)


Проблема: он всегда работает, если myDir не существует. Если myDir существует, иногда он выдает ошибку, иногда он работает.



Журнал ошибок:



os.mkdir(myDir)
PermissionError: [WinError 5] Access is denied: 'myDir'


Мое предположение: когда я звоню os.мкдир, иногда шутил.rmtree не завершил выполнение / не выпустил разрешение для каталога. Отсюда и ошибка.



Есть ли какой-либо способ обеспечить полное выполнение шутил.rmtree перед вызовом os.команды mkdir?

675   2  

2 ответов:

Таким образом, я столкнулся с той же проблемой. То, что я использую, - это пауза после shutil.rmtree. Я думаю, что в значительной степени все, что заставляет ваш компьютер использовать тактовый цикл, будет работать. Весь код:

import os 
import shutil 
import time

dataDir = 'C:/Data/'
if os.path.exists(TEMPDIR):
    shutil.rmtree(TEMPDIR)
time.sleep(.0000000000000001)
os.makedirs(TEMPDIR)

Я сталкивался с подобными проблемами / тем же сообщением об ошибке в Windows 10 с вызовами shutil.rmtree (dir) отказано в доступе и впоследствии не выполняется. Это в примитивной программе резервного копирования, которую я написал, которая предназначена для удаления резервных копий в течение определенного возраста. Я все еще тестирую ниже, но до сих пор он работает как временный обходной путь в моих настройках, однако ваш пробег может варьироваться.

Запуск скрипта от имени администратора также не помог. Использование ОС.chmod (f, S_IWRITE) [и/или статистика.S_IRUSR / stat.S_IRGRP / stat.S_IROTH / stat.S_IXUSR / stat.S_IRUSR / stat.S_IWUSR / stat.S_IWGRP / stat.S_IXGRP] также получил такой же отказ от ОС. Изменение доступа к контролируемым папкам (что, как я подозреваю, может быть причиной этого в Windows 10), а также изменение свойств только для чтения в соответствующих каталогах также не помогло. Ни изменение владельца, ни доступ на запись во вкладке Безопасность не помогли.

Обходной путь, который я использую в данный момент, заключается в установке, импорте и использовании модуль "send2trash", который может быть использован для удаления каталога-при условии, что ваша программа в противном случае работает-без указанной ошибки доступа.

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

Я надеюсь, что это полезно.

Comments

    Ничего не найдено.