[python-win32] Walking the shell namespace in Python

Tim Golden mail at timgolden.me.uk
Thu May 6 10:53:34 CEST 2010


On 05/05/2010 20:33, Thomas Heller wrote:
> Does someone have example code snippets how to walk the shell namespace in Python?
> I'm lost in all these pidls and folders.

The code below uses the pywin32 functions to walk. Because there's all
sorts of things which can happen, I've implemented a v. broad except:
clause just to keep things going. Since this uses the pywin32 wrappers,
it's hiding a certain amount of the PIDL/SHITEM stuff, but the functions
are pretty much the underlying win32 ones.

One thing I don't know how to do without using comtypes is to find the parent.
the SHBindToParent function would be the way to go but it's not exposed and
I don't have the energy to set up all the comtypes boilerplate to make it happen:
I'm sure you can manage, though :)

   http://msdn.microsoft.com/en-us/library/bb762114%28VS.85%29.aspx

The upside of the pywin32 wrappers (lots of stuff done for you) is also
its downside (you can't take complete control if you need to).

<code>
import os, sys

import pythoncom
from win32com.shell import shell, shellcon

def walk (root=None, parent=None):
   try:
     if root is None:
       root_folder = shell.SHGetDesktopFolder ()
       root_name = root_folder.GetDisplayNameOf ([], shellcon.SHGDN_NORMAL)
     else:
       root_folder = parent.BindToObject (root, None, shell.IID_IShellFolder)
       root_name = parent.GetDisplayNameOf (root, shellcon.SHGDN_NORMAL)

     folders = list (root_folder.EnumObjects (None, shellcon.SHCONTF_FOLDERS))
     items = list (root_folder.EnumObjects (None, shellcon.SHCONTF_NONFOLDERS))
     yield (
       root_name,
       [root_folder.GetDisplayNameOf (f, shellcon.SHGDN_NORMAL) for f in folders],
       [root_folder.GetDisplayNameOf (i, shellcon.SHGDN_NORMAL) for i in items]
     )

     for folder in folders:
       for info in walk (folder, root_folder):
         yield info

   except pythoncom.com_error:
     pass

if __name__ == '__main__':
   for root, folders, items in walk ():
     print root, folders, items

</code>


TJG


More information about the python-win32 mailing list