A NullReferenceException
бросается, когда мы пытаемся получить доступ к свойствам нулевого объекта или когда значение строки становится пустым, и мы пытаемся получить доступ к строковым методам.
Например:
string str = string.Empty;
str.ToLower(); // throw null reference exception
Public Class Person {
public string Name { get; set; }
}
Person objPerson;
objPerson.Name /// throw Null refernce Exception
Если вы используете 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 () .
Метод, который я использовал, должен делать:
if os.path.exists(target) :
subprocess.check_call(('attrib -R ' + target + '\\* /S').split())
shutil.rmtree(target)
Прежде чем кто-то скачет ко мне, я знаю, что это ужасно непитоноязычное, но, возможно, проще, чем более традиционные ответы выше, и был надежным.
Я не уверен, что происходит с атрибутами чтения / записи в каталогах. Но это еще не проблема.
Принятый ответ почти прав, но он может выйти из строя в случае подкаталога, доступного только для чтения.
Функция задается как аргумент обработчика 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)
В случае сбоя функции снова можно увидеть причину и продолжить удаление.
Не тестировалось, но было бы полезно включить доступ для записи.
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)
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/