# Sample implementation of IFileOperationProgressSink that just prints # some basic info import pythoncom from win32com.shell import shell, shellcon from win32com.server.policy import DesignatedWrapPolicy tsf_flags = list((k,v) for k,v in list(shellcon.__dict__.items()) if k.startswith('TSF_')) def decode_flags(flags): if flags == 0: return 'TSF_NORMAL' flag_txt = '' for k,v in tsf_flags: if flags & v: if flag_txt: flag_txt = flag_txt + '|' + k else: flag_txt = k return flag_txt class FileOperationProgressSink(DesignatedWrapPolicy): _com_interfaces_ = [shell.IID_IFileOperationProgressSink] _public_methods_ = [ "StartOperations", "FinishOperations", "PreRenameItem", "PostRenameItem", "PreMoveItem", "PostMoveItem", "PreCopyItem", "PostCopyItem", "PreDeleteItem", "PostDeleteItem", "PreNewItem", "PostNewItem", "UpdateProgress", "ResetTimer", "PauseTimer", "ResumeTimer" ] def __init__(self): self._wrap_(self) def StartOperations(self): print ('StartOperations') def FinishOperations(self, Result): print(('FinishOperations: HRESULT ', Result)) def PreRenameItem(self, Flags, Item, NewName): print(('PreRenameItem: Renaming ' + Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + \ ' to ' + NewName)) def PostRenameItem(self, Flags, Item, NewName, hrRename, NewlyCreated): if NewlyCreated is not None: newfile = NewlyCreated.GetDisplayName(shellcon.SHGDN_FORPARSING) else: newfile = 'not renamed, HRESULT ' + str(hrRename) print(('PostRenameItem: renamed ' + \ Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + newfile)) def PreMoveItem(self, Flags, Item, DestinationFolder, NewName): print(('PreMoveItem: Moving ' + \ Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + \ DestinationFolder.GetDisplayName(shellcon.SHGDN_FORPARSING) + '\\' + str(NewName))) def PostMoveItem(self, Flags, Item, DestinationFolder, NewName, hrMove, NewlyCreated): if NewlyCreated is not None: newfile = NewlyCreated.GetDisplayName(shellcon.SHGDN_FORPARSING) else: newfile = 'not copied, HRESULT ' + str(hrMove) print(('PostMoveItem: Moved ' + \ Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + newfile)) def PreCopyItem(self, Flags, Item, DestinationFolder, NewName): if not NewName: NewName = '' print(('PreCopyItem: Copying ' + \ Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + \ DestinationFolder.GetDisplayName(shellcon.SHGDN_FORPARSING) + '\\' + NewName)) print(('Flags: ', decode_flags(Flags))) def PostCopyItem(self, Flags, Item, DestinationFolder, NewName, hrCopy, NewlyCreated): if NewlyCreated is not None: newfile = NewlyCreated.GetDisplayName(shellcon.SHGDN_FORPARSING) else: newfile = 'not copied, HRESULT ' + str(hrCopy) print(('PostCopyItem: Copied ' + Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + newfile)) print(('Flags: ', decode_flags(Flags))) def PreDeleteItem(self, Flags, Item): print(('PreDeleteItem: Deleting ' + Item.GetDisplayName(shellcon.SHGDN_FORPARSING))) def PostDeleteItem(self, Flags, Item, hrDelete, NewlyCreated): print(('PostDeleteItem: Deleted ' + Item.GetDisplayName(shellcon.SHGDN_FORPARSING))) if NewlyCreated: print((' Moved to recycle bin - ' + NewlyCreated.GetDisplayName(shellcon.SHGDN_FORPARSING))) def PreNewItem(self, Flags, DestinationFolder, NewName): print(('PreNewItem: Creating ' + DestinationFolder.GetDisplayName(shellcon.SHGDN_FORPARSING) + '\\' + NewName)) def PostNewItem(self, Flags, DestinationFolder, NewName, TemplateName, FileAttributes, hrNew, NewItem): print(('PostNewItem: Created ' + NewItem.GetDisplayName(shellcon.SHGDN_FORPARSING))) def UpdateProgress(self, WorkTotal, WorkSoFar): print(('UpdateProgress: ', WorkSoFar, WorkTotal)) def ResetTimer(self): print ('ResetTimer') def PauseTimer(self): print ('PauseTimer') def ResumeTimer(self): print ('ResumeTimer') def CreateSink(): return pythoncom.WrapObject(FileOperationProgressSink(), shell.IID_IFileOperationProgressSink)