在 Python 中打开文件夹并选中该文件(不直接打开),有两种实现方式:
方式一
使用 os 模块,最简单。
无论是否存在已经选中该文件的资源管理器窗口,每次执行都会新建一个。
例如,打开文件夹并选中 D:\ 下的 111.pdf 文件:
import os
os.system(r"explorer /select,D:\111.pdf")
但是有一个问题,容易被杀毒软件拦截,用户体验不佳;如果文件名包含特殊符号,就无法识别,默认就打开我的文档目录了。
方式二
使用 SHOpenFolderAndSelectItems
函数(参考文档),与方式一不同的是,若存在已打开此位置的资源管理器窗口,则会切换到该窗口,并选中文件,反之则新建一个资源管理器窗口并选中。这种方式有一个好处,就是不会被杀毒软件拦截。
这里使用 ctypes 实现,不需要再安装 pywin32 了。
import os
import ctypes
class ITEMIDLIST(ctypes.Structure):
_fields_ = [("mkid", ctypes.c_byte)]
def open_folder_and_select_item(file_path):
def get_pidl(path):
pidl = ctypes.POINTER(ITEMIDLIST)()
ctypes.windll.shell32.SHParseDisplayName(path, None, ctypes.byref(pidl), 0, None)
return pidl
ctypes.windll.ole32.CoInitialize(None)
try:
folder_pidl = get_pidl(os.path.dirname(file_path))
file_pidl = get_pidl(file_path)
result = ctypes.windll.shell32.SHOpenFolderAndSelectItems(folder_pidl, 1, ctypes.byref(file_pidl), 0)
if result != 0:
print("Error Code:", result)
else:
print("Success!")
finally:
ctypes.windll.ole32.CoUninitialize()
file_path = "D:\\111.pdf"
open_folder_and_select_item(file_path)