|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- """
- Demonstrates how to propagate a folder's view state to all its subfolders
- The format of the ColInfo stream is apparently undocumented, but
- it can be read raw from one folder and copied to another's view state.
- """
-
- import os
- import sys
-
- import pythoncom
- from win32com.shell import shell, shellcon
-
- template_folder = os.path.split(sys.executable)[0]
- print("Template folder:", template_folder)
- template_pidl = shell.SHILCreateFromPath(template_folder, 0)[0]
- template_pb = shell.SHGetViewStatePropertyBag(
- template_pidl,
- "Shell",
- shellcon.SHGVSPB_FOLDERNODEFAULTS,
- pythoncom.IID_IPropertyBag,
- )
-
- # Column info has to be read as a stream
- # This may blow up if folder has never been opened in Explorer and has no ColInfo yet
- template_iunk = template_pb.Read("ColInfo", pythoncom.VT_UNKNOWN)
- template_stream = template_iunk.QueryInterface(pythoncom.IID_IStream)
- streamsize = template_stream.Stat()[2]
- template_colinfo = template_stream.Read(streamsize)
-
-
- def update_colinfo(not_used, dir_name, fnames):
- for fname in fnames:
- full_fname = os.path.join(dir_name, fname)
- if os.path.isdir(full_fname):
- print(full_fname)
- pidl = shell.SHILCreateFromPath(full_fname, 0)[0]
- pb = shell.SHGetViewStatePropertyBag(
- pidl,
- "Shell",
- shellcon.SHGVSPB_FOLDERNODEFAULTS,
- pythoncom.IID_IPropertyBag,
- )
- ## not all folders already have column info, and we're replacing it anyway
- pb.Write("ColInfo", template_stream)
- iunk = pb.Read("ColInfo", pythoncom.VT_UNKNOWN)
- s = iunk.QueryInterface(pythoncom.IID_IStream)
- s.Write(template_colinfo)
- s = None
- ## attribute names read from registry, can't find any way to enumerate IPropertyBag
- for attr in (
- "Address",
- "Buttons",
- "Col",
- "Vid",
- "WFlags",
- "FFlags",
- "Sort",
- "SortDir",
- "ShowCmd",
- "FolderType",
- "Mode",
- "Rev",
- ):
- pb.Write(attr, template_pb.Read(attr))
- pb = None
-
-
- os.path.walk(template_folder, update_colinfo, None)
|