首页 > 解决方案 > 如何使用 findFiles 进行 globby

问题描述

findFiles 到底是什么?

它位于您未阅读的有关文件系统支持的 vscode API 文档中。

武器的选择

VS Code 是一个节点应用程序,扩展也是。每个人都知道这一点。因此,我们第一次需要操作文件时,我们 import fs,这有效,我们尝试一些文件操作,这有效。在这一点上,我们祝贺自己和 VS Code 团队的技能转移,我们停止思考它,因为我们确切地知道如何做到这一点。

为什么会有人怀疑这个选择?从表面上看,Nodefs是一个出色的解决方案。它有据可查、被广泛理解和跨平台。什么都不会出错

一切都出错了

临时突变体,nos et mutamur。像 Docker 和 WSL 这样的东西意味着即使是单个主机上的 Windows 用户也很可能使用远程文件系统。但是 Node fs,以及你的扩展,只知道它启动的文件系统。

您需要文件系统重定向。这意味着在另一端有一个代理,以及某种间接性,因此您可以使用哪种身份验证指定哪个主机上的哪个文件系统。一旦你开始思考这个问题,你就会想知道为什么 VS Code 团队不为他们自己使用的任何魔法发布 API。

vscode.Uri还记得那些你必须拆开才能得到的烦人的东西fsPath吗?所有文件系统 UI 交互事件返回的那些?他们所有的元数据。

切入正题

如果您查看vscode.workspace.fs("fs"?! 这是一条线索!) 您会发现它导出了读取和写入文件和目录所需的所有方法。所有这些方法都需要一个vscode.Uri. 在这一点上,我希望你自己已经把这些点联系起来了。是的,大众的远程文件系统访问(如果您可以调用扩展编写者大众)。

你还没有回答这个问题,Pete:什么是 findFiles?

哦。出色地。好的。对,我希望你们都知道 globby 是什么以及它的用途。显然你不能在远程文件系统上使用它。你的扩展取决于它。猜猜这是干什么用的:

findFiles(
  include: GlobPattern, 
  exclude?: GlobPattern | null, 
  maxResults?: number, 
  token?: CancellationToken
): Thenable<Uri[]>

那是远程文件系统的全局,你有什么问题?

我的问题是它需要一个模式,而不是像 globby 这样的模式数组。

虽然我可以通过逗号分隔模式并用花括号括起来来解决这个问题,这样{**/*.dll,**/*.exe}当模式已经使用这种语法时就会分崩离析。你不能嵌套它。我的用户可能想要使用类似的模式**/*.{exe,dll,pdb,hex,bin,pdf,png,jpg,jpeg,gif,pfx}

那你想要什么,皮特?

到目前为止,这只是你在炫耀。你希望得到什么答案?

好吧,显而易见的解决方案是将包含表达式的模式扩展为多个文字表达式,然后再将它们组合成一个非嵌套表达式。但这很无聊也很难。我讨厌写正则表达式。

或者也许没有必要,并且有一个我没有注意到的解决方案。我不知道。帮助!

标签: node.jsregexvisual-studio-coderemote-accessvscode-extensions

解决方案


Node.js 的大括号扩展库已经存在。它的名字很神秘braces可以从 npm或其在 GitHub 上的存储库中获得

它对一个字符串进行操作并返回一个字符串数组。它可以扩展递归大括号表达式,因此我的应用程序不需要循环。

const toxicExcludes = `{${excludes.join(",")}}`; // may contain nested braces
const safeExcludes = `{${braces.expand(toxicExcludes).join(",")}}`; 

推荐阅读