UWP开发:如何获取指定文件夹内的快捷方式文件
问题核心原因
你枚举不到快捷方式的情况,是UWP沙箱的强制文件过滤规则导致的,和你写的代码逻辑本身没有关系:
.lnk是Windows Shell层面的链接类文件,UWP为了避免应用通过解析快捷方式间接越权访问未授权的文件路径,在所有常规文件枚举接口中,都会默认把这类Shell链接项从返回结果里剔除。- 哪怕你的代码是调用的
GetItemsAsync(),哪怕后续搭配QueryOptions加上.lnk的文件后缀筛选、调整排序规则,只要在纯UWP沙箱上下文运行,枚举结果里都不会出现.lnk项;就算直接拿.lnk的完整路径调用StorageFile.GetFileFromPathAsync(),也会被系统拦截,抛出文件不存在的错误。 - 你代码里写的“文件优先于文件夹排序”的逻辑本身没有问题,只是被系统过滤的.lnk项根本到不了排序环节,自然不会出现在最终的列表里。
纯UWP方案的可行性结论
目前没有任何公开的纯UWP API可以突破这套系统过滤规则:
- 就算给应用申请了
broadFileSystemAccess的全文件系统访问权限,这套针对.lnk的枚举过滤逻辑依然生效,没法正常获取到快捷方式项。 - 所有涉及Shell接口、系统文件索引的相关API,在纯沙箱UWP场景下要么权限不足无法调用,要么依然受上述过滤规则限制,根本达不到获取快捷方式的目的。
实际可落地的实现思路
要实现快捷方式的枚举展示,最适配课程项目场景的方案,就是搭配Win32 FullTrustProcess组件,完全不需要把整个应用改造为全桌面桥应用:
- 只需要在解决方案里加一个极轻量的Win32小程序,把它声明为应用的FullTrust组件即可。这个组件运行在传统Win32权限上下文,不受UWP沙箱的访问限制,可以直接通过传统文件API枚举文件夹内所有的.lnk实体文件,甚至可以直接解析快捷方式指向的目标路径。
- 组件和UWP主进程之间通过AppService完成通信:FullTrust组件拿到文件列表后,把每个文件的完整路径传回UWP侧,UWP只需要把这些路径转换为可展示的列表项就行,整体开发量很低,完全能满足项目需求。
内容的提问来源于stack exchange,提问作者Tofuu
相关产品推荐
相关产品推荐

