如何在Windows中使用Python删除只读attrib目录?

我有一个只读目录从版本控制的目录被locking。 在这里输入图像说明

当我试图用shutil.rmtree(TEST_OBJECTS_DIR)命令删除这个目录时,我收到以下错误信息。

 WindowsError: [Error 5] Access is denied: 'C:\...\environment.txt' 
  • 问:如何更改整个目录结构中的所有内容?

如果使用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()函数中。

没有测试,但它会,就像启用写访问。

 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) 

我用过的方法是做:

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

在任何人跳到我面前之前,我知道这是非常非pythonic,但它可能比上面给出的更传统的答案更简单,并且是可靠的。

我不知道关于目录的读/写属性会发生什么。 但这还没有成为一个问题。

接受的答案几乎是正确的,但是如果是只读子目录,则可能会失败。

该函数作为rmtree的错误处理程序的参数给出。

我会建议:

 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 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/