Repository navigation
[Bug] native-command: openNativeFileApplication always fails for directories (Path.GetExtension early-return) #9774
Replies: 2 comments
|
你找的位置完全准确,逐字对上了。 static void Visit(string path, Action<IHandler> visit) {
var extension = Path.GetExtension(path);
if (extension.Length == 0) return;
IEnumHandlers handlers;
SHAssocEnumHandlers(extension, 0, out handlers);不过我要补一点,它会影响你提的修法: 这意味着目录要能打开,得换成另一条 Shell 路径(比如走 你大概没注意到的第二处同一个文件里, public static Application[] List(string path) {
var extension = Path.GetExtension(path);
var executable = extension.Length == 0 ? null : Associated(extension, 2);
var appId = extension.Length == 0 ? null : Associated(extension, 21);
所以"目录下 0 项"不只是 handler 枚举不到,连"这个类型默认用什么打开"也没有。这解释了为什么症状是"0 项"而不是"有项但打开失败":整条链从默认程序那一步就是空的。这一点建议写进报告,它比只说 至于那个异常你观察到 我这边没有逐行确认 Windows 分支抛的是不是同一句文案——你既然实测到了,就以你的为准,只是引用位置时建议指到 版本情况我查了这个文件从 一个措辞建议你把影响面定位成"接口层健壮性问题、目前未在 UI 上确认稳定触发路径"——这个自我限定很稳,建议保留。 不过可以再具体一点: 你要不要主张"支持目录"取决于是否有真实调用方需要;如果只是健壮性,那"传目录时给出明确错误"可能比"支持目录"更容易被接受。两条我建议你都写出来,让维护者选。 那目录到底该走哪条路如果你确实想让"用某个应用打开目录"这件事成立,方向不在这个文件里。仓库里已经有目录的路径了: 所以更实际的建议是改调用方准入,而不是改 你担心的"互相误判",机制我找到了你这句判断很准,而且有具体出处。现在"打不开"至少有两条路径会显示同一句提示:
两者最后都落到 顺带一个附带发现: 边界我核的是 你是 Windows 11 build 26300,实测断言我没法在这边复现;上面说的都是源码层面的事实。另外你那个去重说明(8 组关键词、与 #7860 / #7021 / #9455 / #9697 的区别)做得很细,省了维护者一轮比对。 |
|
补一条自我更正与几点实测扩展。 感谢 @PerryLink 的源码级复核(对照 0)更正:我原先写的"去掉
1)范围比我原先写的大:没有扩展名的普通文件同样打不开,而这落在接口契约之内 实测(
第三行是关键:点开头文件之所以可用,是因为 .NET 的 2)因此修法建议改为两条,请维护者择一
(B 的连带好处:把目录从这条链路上彻底挡掉,不会与 3)调用方准入缺口(比改
4)异常文案的出处(更正引用位置) 实测抓到的原始报错来自 Windows 侧生成的 PowerShell 适配脚本,而非跨平台分支: 引用请指向 5)
于是目录/无扩展名路径连"这个类型默认用什么打开"都是 6)两条附注(同包,另案)
7)版本状态: |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
环境:
@deepseek-ai/dsh-native-command0.1.7-rc.2 与 0.2.0-rc.2(行为一致),Windows 11 26H2(build 26300)file-applications-windows.js的Visit()在路径没有扩展名时直接返回,于是传目录进来时一个 handler 都不枚举:最小复现(对照组只差一个扩展名):
nativeFileApplicationsopenNativeFileApplicationC:\Users\me\some-folder(目录)Application is not registered for this file%TEMP%\probe.md(同内容、带扩展名)期望:目录按其
Directory关联打开,或回退到 shell 的 open verb。实际:静默返回 0 项 / 抛异常。
影响:接口层缺陷 —— 目前未在 UI 上确认稳定的目录触发路径,属健壮性问题:任何把目录交给该接口的调用方都会失败。它与另一个 catalog 缺陷撞在同一句用户提示「打开失败,请重试」上,排查时容易互相误判。
建议修法:见下方补充评论 —— 原先写的"去掉早退"不成立(
extension是喂给SHAssocEnumHandlers的入参),需要单独分支或明确拒绝。去重说明:已用 8 组关键词(
openNativeFileApplication、nativeFileApplications、Path.GetExtension、file-applications-windows、Application is not registered、directory open in app、目录 打开失败、文件夹 打开方式)检索全部 Discussions,无同题;最近的 4 条(#7860 / #7021 / #9455 / #9697)症状相近但根因不同,区别见下方折叠区。展开:复现脚本与去重证据
复现脚本(Node,直接调用运行时真实加载的入口):
检索记录(2026-10-15,8 组关键词):
openNativeFileApplicationwindowsHide隐藏 Explorer)—— 均非同一问题nativeFileApplicationsPath.GetExtensionApplication is not registeredfile-applications-windowswindowsHide系列,无一涉及"目录 / 无扩展名"directory open in app目录 打开失败文件夹 打开方式结论:
Visit()因缺少扩展名而早退这一条,没有同题。必须点名的 4 条"症状相近、根因不同"(避免被当成重复):
"Open folder" spawns explorer.exe but does not open the directorywindowsHidewindowsHide 用在 GUI 程序上…并导致整个目录后续无法打开windowsHide「显示文件位置」不打开文件夹…explorer.exe 等待没有超时openWorkspacePath 一律拒绝含 junction 或符号链接的路径All reactions