findFiles到底是什么?
它在你沒有讀過的檔案系統支持的vscode API檔案中。
武器的選擇
VS Code 是一個節點應用程式,擴展也是如此。每個人都知道這一點。因此,當我們第一次需要操作一個檔案時,我們匯入fs,這就可以了,然后我們嘗試一些檔案操作,這就可以了。在這一點上,我們祝賀自己和 VS Code 團隊的技能轉移,并且我們不再考慮這個問題,因為我們完全知道如何去做。
為什么會有人懷疑這個選擇呢?從各方面來看,Node fs是一個出色的解決方案。它有很好的檔案,被廣泛理解,并且是跨平臺的。沒有什么可以possibly出錯的。
一切都出錯了
。Tempora mutantur, 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,
排除嗎。GlobPattern | null。
maxResults?: 數字。
token? CancellationToken。
): Thenable<Uri<]>
這是對遠程檔案系統的globby,你的問題是什么?
我的問題是它需要一個單一的模式,而不是像 globby 那樣的一個模式陣列。
雖然我可以通過用逗號分隔模式并在周圍加上大括號來解決這個問題,比如說 {**/*.dll,**/*.exe},但是當模式已經使用這種語法時,就會出現問題。你不允許對它進行嵌套。而我的用戶非常可能想要使用像**/*.{exe,dll,pdb,hex,bin,pdf,png,jpg,jpeg,gif,pfx}
那么,你想要的是什么呢,彼得?
到目前為止,這都是你在炫耀。你希望得到的答案是什么?
好吧,顯而易見的解決方案是將包含運算式的模式擴展為多個字面運算式,然后將它們合并為一個非嵌套運算式。但是這很無聊,也很難。我討厭寫Regexes。
或者,也許這不是必要的,有一個我沒有注意到的解決方案。我不知道。幫助!
uj5u.com熱心網友回復:
[F]alls apart when the patterns already use this syntax. 你不允許嵌套它。
我認為你可以做的就是自己處理嵌套的語法,然后輸出具有你所要求的意義的非嵌套語法。
例如,假設{{a,b},c}x意味著{a,b}x cx,那么這意味著ax bx cx。
請注意,{a,b,c}x也意味著ax bx cx,所以在這個嵌套的概念下,{{a,b},c}等同于{a,b,c}。
如果這就是所需的語意,你可以直接決議你的模式中的嵌套符號,并將任何嵌套平移。
uj5u.com熱心網友回復:
Node已經存在一個括號擴展庫。它被神秘地命名為braces,并且可從npm或從其GitHub上的存盤庫
它對一個字串進行操作并回傳一個字串陣列。它可以展開遞回括號運算式,所以對于我的應用程式來說,不需要回圈。
const toxicExcludes = `{${excludes. join(",")}; //可能包含嵌套的大括號。
const safeExcludes = `{${braces.expand(toxicExcludes).join(", ")}}`;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/307559.html
標籤:
上一篇:只在括號內替換逗號的Regex
