Python 实现打开文件夹并选中文件

技术 · 24 天前 · 48 人浏览

在 Python 中打开文件夹并选中该文件(不直接打开),有两种实现方式:

方式一

使用 os 模块,最简单。
无论是否存在已经选中该文件的资源管理器窗口,每次执行都会新建一个。

例如,打开文件夹并选中 D:\ 下的 111.pdf 文件:

import os
os.system(r"explorer /select,D:\111.pdf")

但是有一个问题,容易被杀毒软件拦截,用户体验不佳;如果文件名包含特殊符号,就无法识别,默认就打开我的文档目录了。

pAIbIUS.jpg
"安全大脑" "极智守护"

方式二

使用 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)

pAIxwzF.png

Python
Theme Jasmine by Kent Liao