如何在Windows中用Python删除只读属性目录?

55 投票
6 回答
75950 浏览
提问于 2025-04-16 10:47

我有一个只读的文件夹,它是从一个被版本控制的文件夹复制过来的,而那个文件夹是锁定的。

在这里输入图片描述

当我尝试用 shutil.rmtree(TEST_OBJECTS_DIR) 命令删除这个文件夹时,出现了以下错误信息。

WindowsError: [Error 5] Access is denied: 'C:\...\environment.txt'
  • 问:我该如何更改整个文件夹结构中所有内容的属性?

6 个回答

9

这个被认可的答案基本上是对的,但在处理只读子目录时可能会出问题。

这个函数是作为参数传递给了rmtreeonerror处理器。

我建议这样做:

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)

如果这个函数再次失败,你可以看到失败的原因,然后继续删除。

16

这个还没测试过,但大概是要开启写入权限。

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)
89

如果你在使用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()函数中加入相应的逻辑。

撰写回答