69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
|
"""
|
||
|
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)
|