Удаление всей папки без & ldquo; Access Denied & rdquo; ошибка [дубликат]

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

Например:

  1. При использовании метода string пустой строки:
    string str = string.Empty;
    str.ToLower(); // throw null reference exception
    
  2. Когда свойство нулевого объекта доступно:
    Public Class Person {
        public string Name { get; set; }
    }
    Person objPerson;
    objPerson.Name  /// throw Null refernce Exception 
    
34
задан prosseek 28 January 2011 в 15:02
поделиться

5 ответов

Если вы используете 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's just assume that it's 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 () .

47
ответ дан jro 28 August 2018 в 17:05
поделиться

Метод, который я использовал, должен делать:

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

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

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

5
ответ дан Mike Gleen 28 August 2018 в 17:05
поделиться

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

Функция задается как аргумент обработчика 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)

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

4
ответ дан Tomasz Gandor 28 August 2018 в 17:05
поделиться

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

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)
9
ответ дан YOU 28 August 2018 в 17:05
поделиться
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/

3
ответ дан zoumi 28 August 2018 в 17:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: