Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remove read-only attrib directory with Python in Windows?

I have a read only directory copied from version controlled directory which is locked. enter image description here

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

WindowsError: [Error 5] Access is denied: 'C:\...\environment.txt'
  • Q : How can I change the attribute of everything in a whole directory structure?
like image 581
prosseek Avatar asked Jan 28 '11 14:01

prosseek


People also ask

How do I remove a file path in Python?

os. remove() method in Python is used to remove or delete a file path. This method can not remove or delete a directory. If the specified path is a directory then OSError will be raised by the method.


2 Answers

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.

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.

like image 70
Mark Avatar answered Oct 11 '22 07:10

Mark


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

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)
like image 16
YOU Avatar answered Oct 11 '22 06:10

YOU