Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

pywin32 programming error on Win7 with shell.SHGetDesktopFolder,desktop.BindToObject,desktop.GetDisplayNameOf

61 views
Skip to first unread message

iMath

unread,
Nov 7, 2013, 10:30:01 PM11/7/13
to

When running the following code on WinXP , all is fine ,
--------------------------------------------------------------
from win32com.shell import shell

def launch_file_explorer(path, files):

folder_pidl = shell.SHILCreateFromPath(path,0)[0]
desktop = shell.SHGetDesktopFolder()
shell_folder = desktop.BindToObject(folder_pidl, None,shell.IID_IShellFolder)
name_to_item_mapping = dict([(desktop.GetDisplayNameOf(item, 0), item) for item in shell_folder])
to_show = []
for file in files:
if file not in name_to_item_mapping:
raise Exception('File: "{}" not found in "{}"'.format(file, path))
to_show.append(name_to_item_mapping[file])
shell.SHOpenFolderAndSelectItems(folder_pidl, to_show, 0)
import os


p=r'E:\aa'
print(os.listdir(p))
launch_file_explorer(p, os.listdir(p))
--------------------------------------------------------------

however ,when tested on Win7,I got the following error

--------------------------------------------------------------

['b1', 'b2', 't.txt']
Traceback (most recent call last):
File "D:\g.py", line 21, in <module>
launch_file_explorer(p, os.listdir(p))
File "D:\g.py", line 13, in launch_file_explorer
raise Exception('File: "{}" not found in "{}"'.format(file, path))
Exception: File: "t.txt" not found in "E:\aa"
--------------------------------------------------------------
I nearly have no experience on pywin32 programming ,the above code is googled,anyone can help me fix this error ?thanks in advance !

Tim Golden

unread,
Nov 8, 2013, 4:47:43 AM11/8/13
to pytho...@python.org
On 08/11/2013 03:30, iMath wrote:
>
> When running the following code on WinXP , all is fine ,
> --------------------------------------------------------------
> from win32com.shell import shell
>
> def launch_file_explorer(path, files):
>
> folder_pidl = shell.SHILCreateFromPath(path,0)[0]
> desktop = shell.SHGetDesktopFolder()
> shell_folder = desktop.BindToObject(folder_pidl, None,shell.IID_IShellFolder)
> name_to_item_mapping = dict([(desktop.GetDisplayNameOf(item, 0), item) for item in shell_folder])
> to_show = []
> for file in files:
> if file not in name_to_item_mapping:
> raise Exception('File: "{}" not found in "{}"'.format(file, path))
> to_show.append(name_to_item_mapping[file])
> shell.SHOpenFolderAndSelectItems(folder_pidl, to_show, 0)
> import os
>
>
> p=r'E:\aa'
> print(os.listdir(p))
> launch_file_explorer(p, os.listdir(p))


Did you mean to call .GetDisplayNameOf against the desktop folder? I
would have thought you wanted shell_folder.GetDisplayNameOf(item, 0).

TJG

iMath

unread,
Nov 8, 2013, 10:28:06 AM11/8/13
to
在 2013年11月8日星期五UTC+8下午5时47分43秒,Tim Golden写道:
I mainly want to use shell.SHOpenFolderAndSelectItems()

iMath

unread,
Nov 8, 2013, 10:28:16 AM11/8/13
to
在 2013年11月8日星期五UTC+8下午5时47分43秒,Tim Golden写道:

MRAB

unread,
Nov 8, 2013, 12:51:52 PM11/8/13
to pytho...@python.org
On 08/11/2013 03:30, iMath wrote:
>
It's building a dict where the key is the result of
desktop.GetDisplayNameOf(item, 0), and it's then not finding a given
name in that dict.

Try printing the keys to see what's there. It might be that
desktop.GetDisplayNameOf(item, 0) returns different strings in Win7
from those in WinXP.

iMath

unread,
Nov 10, 2013, 12:23:29 AM11/10/13
to
thanks, I found out the reason: this question has no relationship with Win7
or WinXP,but related to the users' system setting .
GetDisplayNameOf() only gives the DISPLAY name ,so the filename with or without extension acording to whether the user want to view files in the explorer with extension .
my settings is that filename with extension on WinXP but not on Win7,while os.listdir() returns filenames with extension on both of them ,this caused my problem here .
so anyone know how to fix my problem ? I mainly want to use shell.SHOpenFolderAndSelectItems() here.

iMath

unread,
Nov 10, 2013, 7:39:14 AM11/10/13
to
I solved it like the following

from win32com.shell import shell, shellcon
import os
def launch_file_explorer(path, files):
'''
Given a absolute base path and names of its children (no path), open
up one File Explorer window with all the child files selected
'''
folder_pidl = shell.SHILCreateFromPath(path,0)[0]
desktop = shell.SHGetDesktopFolder()
shell_folder = desktop.BindToObject(folder_pidl, None,shell.IID_IShellFolder)
name_to_item_mapping = dict([(desktop.GetDisplayNameOf(item, shellcon.SHGDN_FORPARSING|shellcon.SHGDN_INFOLDER), item) for item in shell_folder])
print(name_to_item_mapping)
to_show = []
for file in files:
if file in name_to_item_mapping:
to_show.append(name_to_item_mapping[file])
# else:
# raise Exception('File: "%s" not found in "%s"' % (file, path))

shell.SHOpenFolderAndSelectItems(folder_pidl, to_show, 0)

iMath

unread,
Nov 10, 2013, 7:39:25 AM11/10/13
to
I solved it like the following

from win32com.shell import shell, shellcon
import os
def launch_file_explorer(path, files):
'''
Given a absolute base path and names of its children (no path), open
up one File Explorer window with all the child files selected
'''
folder_pidl = shell.SHILCreateFromPath(path,0)[0]
desktop = shell.SHGetDesktopFolder()
shell_folder = desktop.BindToObject(folder_pidl, None,shell.IID_IShellFolder)
name_to_item_mapping = dict([(desktop.GetDisplayNameOf(item, shellcon.SHGDN_FORPARSING|shellcon.SHGDN_INFOLDER), item) for item in shell_folder])
print(name_to_item_mapping)
to_show = []
for file in files:
if file in name_to_item_mapping:
to_show.append(name_to_item_mapping[file])
# else:
# raise Exception('File: "%s" not found in "%s"' % (file, path))

shell.SHOpenFolderAndSelectItems(folder_pidl, to_show, 0)



0 new messages