VSCode插件readDirectory遍历目录时未知错误-4094的分析与解决

VSCode插件readDirectory遍历目录时未知错误-4094的分析与解决

IShirai_KurokoI

在改别人的钢丝插件的时候,发现模组目录的本地化资源文件始终遍历不出来,结果为空,上vscodium调试发现报错未知错误-4094,ScanDir报错读取子目录异常。

最开始我还以为是子目录名称是replace(怎么可能嘛)或者目录路径有中文导致的,后来新建了一个test目录发现也这样,我就知道不是这个问题了,但是同样的代码,原始插件中钢丝安装目录的子目录就没问题,这就奇了怪了,所以我把目录对象都打印出来看看怎么个事。

相信眼尖的朋友已经看出来了,图中下面的子目录被处理之后相当于进行了URL编码,这种处理对于Windows文件资源管理器来说没有影响,但是,会导致node的fs模块无法扫描目录,那怎么解决呢?

实际上,path.join(dir.path, name)是一个平台函数,他在自动处理vscode的Uri时会对路径进行处理,导致出现二次URL编码一样的问题。

知道问题所在之后,解决办法也很简单,换成vscode自己的路径拼接函数就可以了

1
2
3
4
5
6
7
8
9
10
async function readDirFilesRecursivelyImpl(dir: vscode.Uri, prefix: string, result: string[]): Promise<void> {
const items = await vscode.workspace.fs.readDirectory(dir);
for (const [name, type] of items) {
if (type === vscode.FileType.File) {
result.push(prefix + name);
} else if (type === vscode.FileType.Directory) {
await readDirFilesRecursivelyImpl(vscode.Uri.joinPath(dir, name), prefix + name + '/', result);
}
}
}

顺便吐槽一句p社员工写的乱七八糟的yml文件,根本不符合yml规范,光注释就五种格式,还有在yml冒号后值前加数字的,还有最后不写引号,中间引号不转义的,还有子值跟父值一个缩进的,js-yaml咔咔报错,我咔咔写正则文本预处理。。。

  • 标题: VSCode插件readDirectory遍历目录时未知错误-4094的分析与解决
  • 作者: IShirai_KurokoI
  • 创建于 : 2024-09-01 10:47:00
  • 更新于 : 2024-09-01 12:49:30
  • 链接: https://ishiraikurokoi.top/2024-09-01-VSCode-Extension-Directory-Walk/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
VSCode插件readDirectory遍历目录时未知错误-4094的分析与解决