Spaces:
Sleeping
Sleeping
""" | |
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) | |