Подтвердить что ты не робот

Как удалить каталог атрибутов только для чтения с Python в Windows?

У меня есть только для чтения каталог, скопированный из управляемой версией каталога, который заблокирован. enter image description here

Когда я попытался удалить этот каталог с помощью команды shutil.rmtree(TEST_OBJECTS_DIR), я получил следующее сообщение об ошибке.

WindowsError: [Error 5] Access is denied: 'C:\...\environment.txt'
  • В: Как изменить атрибут всего в структуре целого?
4b9b3361

Ответ 1

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

import os, shutil, stat

def on_rm_error( func, path, exc_info):
    # path contains the path of the file that couldn't be removed
    # let just assume that it read-only and unlink it.
    os.chmod( path, stat.S_IWRITE )
    os.unlink( path )

shutil.rmtree( TEST_OBJECTS_DIR, onerror = on_rm_error )

Теперь, если быть справедливым, функцию ошибки можно было бы вызвать по целому ряду причин. Параметр "func" может рассказать вам, какая функция "сбой" (os.rmdir() или os.remove()). То, что вы здесь делаете, зависит от того, насколько вы хотите, чтобы ваш Rmtree был доказательством пули. Если это действительно случай, когда нужно отметить файлы как доступные для записи, вы можете сделать то, что я сделал выше. Если вы хотите быть более осторожным (т.е. Определить, удаляется ли каталог не удаляется или если при попытке его удалить нарушение доступа к файлу), соответствующая логика должна быть вставлена ​​в функцию on_rm_error().

Ответ 2

Не тестировалось, но это было бы похоже на то, чтобы включить доступ для записи.

import os, stat

os.chmod(ur"file_path_name", stat.S_IWRITE)

Вам может потребоваться комбинировать с os.walk, чтобы сделать все записи разрешены. что-то вроде

for root, dirs, files in os.walk(ur'root_dir'):
    for fname in files:
        full_path = os.path.join(root, fname)
        os.chmod(full_path ,stat.S_IWRITE)

Ответ 3

Используемый мной метод:

if os.path.exists(target) :
    subprocess.check_call(('attrib -R ' + target + '\\* /S').split())
    shutil.rmtree(target)

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

Я не уверен, что происходит с атрибутами чтения/записи в каталогах. Но это еще не проблема.

Ответ 4

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

Функция задается как аргумент обработчику rmtree onerror.

Я бы предложил:

import os, shutil, stat

def remove_readonly(fn, path, excinfo):
    try:
        os.chmod(path, stat.S_IWRITE)
        fn(path)
    except Exception as exc:
        print "Skipped:", path, "because:\n", exc

shutil.rmtree(TEST_OBJECTS_DIR, onerror=remove_readonly)

Если функция снова не работает, вы можете увидеть причину и продолжить удаление.

Ответ 5

import win32con, win32api,os

file='test.txt'

#make the file hidden
win32api.SetFileAttributes(file,win32con.FILE_ATTRIBUTE_HIDDEN)

#make the file read only
win32api.SetFileAttributes(file,win32con.FILE_ATTRIBUTE_READONLY)

#to force deletion of a file set it to normal
win32api.SetFileAttributes(file, win32con.FILE_ATTRIBUTE_NORMAL)
os.remove(file)

скопировать из: http://code.activestate.com/recipes/303343-changing-file-attributes-on-windows/