如何用Python3.10的tkinter.filedialog获取.lnk文件自身路径?
解决.lnk文件路径获取与跨电脑报错问题
问题根源
Windows下tkinter的askopenfilenames默认调用原生资源管理器对话框,会自动解析.lnk快捷方式,返回其指向的目标文件路径而非快捷方式本身的路径。当把.lnk复制到其他电脑后,目标文件通常不存在,因此触发FileNotFoundError。
解决方案
方案1:禁用快捷方式解析,直接获取.lnk自身路径
给askopenfilenames添加options={'dontuseew': True}参数,强制使用tkinter自带的文件对话框而非Windows原生对话框,就能直接拿到.lnk文件的真实路径:
import tkinter as tk from tkinter import filedialog import os import datetime root = tk.Tk() root.withdraw() # 弹出文件选择框,禁用快捷方式解析 file_paths = filedialog.askopenfilenames( title="选择文件", filetypes=[("所有文件", "*.*"), ("快捷方式文件", "*.lnk")], options={'dontuseew': True} ) # 遍历处理选中的文件 for path in file_paths: # 获取文件自身的生成时间 gen_time = datetime.datetime.fromtimestamp(os.path.getmtime(path)) print(f"文件路径:{path},生成时间:{gen_time}")
这种方式无需额外依赖,能直接获取.lnk文件本身的路径,复制到其他电脑也不会因为目标文件不存在报错。
方案2:用pywin32同时处理.lnk自身与目标路径
如果需要同时获取.lnk自身信息和它指向的目标文件,可以借助pywin32库解析快捷方式:
先安装依赖:
pip install pywin32
代码示例:
import tkinter as tk from tkinter import filedialog import os import datetime import win32com.client root = tk.Tk() root.withdraw() file_paths = filedialog.askopenfilenames( title="选择文件", filetypes=[("所有文件", "*.*"), ("快捷方式文件", "*.lnk")] ) shell = win32com.client.Dispatch("WScript.Shell") for path in file_paths: # 先处理文件自身的生成时间 gen_time = datetime.datetime.fromtimestamp(os.path.getmtime(path)) print(f"文件路径:{path},生成时间:{gen_time}") # 如果是快捷方式,可选解析目标路径 if path.endswith(".lnk"): try: shortcut = shell.CreateShortCut(path) print(f"快捷方式目标路径:{shortcut.Targetpath}") except Exception as e: print(f"解析快捷方式失败:{str(e)}")
这个方案在跨电脑场景下,依然能正常获取.lnk自身的路径和时间,解析目标路径时若目标不存在会抛出异常,可按需处理。
内容的提问来源于stack exchange,提问作者DaveDT
相关产品推荐
相关产品推荐

