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

时间:2022-09-11 17:57:19

I have a read only directory copied from version controlled directory which is locked. 如何在Windows中使用Python删除只读attrib目录?

我有一个从版本控制目录复制的只读目录,该目录已被锁定。

When I tried to remove this directory with shutil.rmtree(TEST_OBJECTS_DIR) command, I got the following error message.

当我尝试使用shutil.rmtree(TEST_OBJECTS_DIR)命令删除此目录时,出现以下错误消息。

WindowsError: [Error 5] Access is denied: 'C:\...\environment.txt'
  • Q : How can I change the attribute of everything in a whole directory structure?
  • 问:如何更改整个目录结构中所有内容的属性?

5 个解决方案

#1


46  

If you are using shutil.rmtree, you can use the onerror member of that function to provide a function that takes three params: function, path, and exception info. You can use this method to mark read only files as writable while you are deleting your tree.

如果您使用的是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 )

Now, to be fair, the error function could be called for a variety of reasons. The 'func' parameter can tell you what function "failed" (os.rmdir() or os.remove()). What you do here depends on how bullet proof you want your rmtree to be. If it's really just a case of needing to mark files as writable, you could do what I did above. If you want to be more careful (i.e. determining if the directory coudln't be removed, or if there was a sharing violation on the file while trying to delete it), the appropriate logic would have to be inserted into the on_rm_error() function.

现在,公平地说,可以出于各种原因调用错误函数。 'func'参数可以告诉你什么函数“失败”(os.rmdir()或os.remove())。你在这里做什么取决于你想要你的rmtree如何防弹。如果它真的只是需要将文件标记为可写的情况,那么你可以做我上面做的。如果您想要更加小心(即确定目录是否未被删除,或者在尝试删除文件时是否存在共享冲突),则必须将相应的逻辑插入到on_rm_error()函数中。

#2


9  

Not tested but It would be, something like to enable write access.

没有经过测试,但它会像启用写访问一样。

import os, stat

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

You may need to combine with os.walk to make everything write enable. something like

您可能需要与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


5  

The method that I have used is to do:

我用过的方法是:

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

Before anyone jumps on me, I know that this is dreadfully un-pythonic, but it is possibly simpler than the more traditional answers given above, and has been reliable.

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

I'm not sure what happens regarding read/write attributes on directories. But it hasn't been an issue yet.

我不确定目录上的读/写属性会发生什么。但它还不是一个问题。

#4


4  

The accepted answer is almost right, but it could fail in case of a read-only subdirectory.

接受的答案几乎是正确的,但在只读子目录的情况下可能会失败。

The function is given as an argument to the rmtree's onerror handler.

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

I would suggest:

我会建议:

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)

In case the function fails again, you can see the reason, and continue deleting.

如果该功能再次失败,您可以看到原因,并继续删除。

#5


3  

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)

copy from:http://code.activestate.com/recipes/303343-changing-file-attributes-on-windows/

复制自:http://code.activestate.com/recipes/303343-changing-file-attributes-on-windows/

#1


46  

If you are using shutil.rmtree, you can use the onerror member of that function to provide a function that takes three params: function, path, and exception info. You can use this method to mark read only files as writable while you are deleting your tree.

如果您使用的是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 )

Now, to be fair, the error function could be called for a variety of reasons. The 'func' parameter can tell you what function "failed" (os.rmdir() or os.remove()). What you do here depends on how bullet proof you want your rmtree to be. If it's really just a case of needing to mark files as writable, you could do what I did above. If you want to be more careful (i.e. determining if the directory coudln't be removed, or if there was a sharing violation on the file while trying to delete it), the appropriate logic would have to be inserted into the on_rm_error() function.

现在,公平地说,可以出于各种原因调用错误函数。 'func'参数可以告诉你什么函数“失败”(os.rmdir()或os.remove())。你在这里做什么取决于你想要你的rmtree如何防弹。如果它真的只是需要将文件标记为可写的情况,那么你可以做我上面做的。如果您想要更加小心(即确定目录是否未被删除,或者在尝试删除文件时是否存在共享冲突),则必须将相应的逻辑插入到on_rm_error()函数中。

#2


9  

Not tested but It would be, something like to enable write access.

没有经过测试,但它会像启用写访问一样。

import os, stat

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

You may need to combine with os.walk to make everything write enable. something like

您可能需要与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


5  

The method that I have used is to do:

我用过的方法是:

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

Before anyone jumps on me, I know that this is dreadfully un-pythonic, but it is possibly simpler than the more traditional answers given above, and has been reliable.

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

I'm not sure what happens regarding read/write attributes on directories. But it hasn't been an issue yet.

我不确定目录上的读/写属性会发生什么。但它还不是一个问题。

#4


4  

The accepted answer is almost right, but it could fail in case of a read-only subdirectory.

接受的答案几乎是正确的,但在只读子目录的情况下可能会失败。

The function is given as an argument to the rmtree's onerror handler.

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

I would suggest:

我会建议:

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)

In case the function fails again, you can see the reason, and continue deleting.

如果该功能再次失败,您可以看到原因,并继续删除。

#5


3  

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)

copy from:http://code.activestate.com/recipes/303343-changing-file-attributes-on-windows/

复制自:http://code.activestate.com/recipes/303343-changing-file-attributes-on-windows/