Recursive directory deletes and special files

Existing document

\win32\help\file.d Part 2

Python’s win32 access for file properties to enable deletes

Sometimes you may want to do something like remove entire directory trees. Python has some great utilities to do that, except files with special attributes cannot be typically deleted.

To get around this problem you need to use the win32 call to SetFileAttributes to be a normal file.

The C++ call looks like this:

BOOL SetFileAttributes(
   LPCTSTR lpFileName,
   DWORD dwFileAttributes
);

You provide it 2 arguments the filename and the specific attributes and it returns whether or not it succeeded.

The corresponding python call is:

int = win32api.SetFileAttributes( pathName, attrs )

The only question is where do you get attrs. It is included in the ever handy win32con module specifically - win32con.FILE_ATTRIBUTE_*. You can set a file to be read only, archive, hidden, etc. We are concerned with setting it back to normal, so we want: win32con.FILE_ATTRIBUTE_NORMAL

The example below can be useful, but, of course, be careful with it, since it deletes a lot of stuff. It is a recursive function The example also makes use of some handy functions from the os module.

Example

Here is a basic example of how to remove a directory tree:

import win32con
import win32api
import os

def del_dir(self,path):
   for file in os.listdir(path):
      file_or_dir = os.path.join(path,file)
      if os.path.isdir(file_or_dir) and not os.path.islink(file_or_dir):
         del_dir(file_or_dir) #it's a directory reucursive call to function again
      else:
         try:
            os.remove(file_or_dir) #it's a file, delete it
         except:
            #probably failed because it is not a normal file
            win32api.SetFileAttributes(file_or_dir, win32con.FILE_ATTRIBUTE_NORMAL)
            os.remove(file_or_dir) #it's a file, delete it
      os.rmdir(path) #delete the directory here

Have a great time with programming with python!

John Nielsen nielsenjf@my-deja.com