繁体   English   中英

在vscode扩展名的文件夹中列出文件

[英]Listing files in folder in vscode extension

我正在创建一个vscode扩展名,它可以对文件路径进行一些自定义自动完成。

我要接受用户键入的内容,如果该值解析为工作空间中的文件夹,则要列出该文件夹中的所有文件以自动完成。

例如,给定:

  • 位于/ home / me / my-vs-project的工作空间
  • 带有文件:
    • /home/me/my-vs-project/assets/dog.png
    • /home/me/my-vs-project/assets/cat.jpeg

如果我在vscode中输入'assets'或'./assets',则扩展名应该能够为我提供以下内容的自动填充列表:

  • './assets/dog.png'
  • './assets/cat.png'

这是无效的代码片段(返回0个结果)。

let inputAsWorkspaceRelativeFolder = getInput(document, position); // for example, would return: '/home/me/my-vs-project/assets' for input of './assets'

let glob = inputAsWorkspaceRelativeFolder + '/*';

vscode.workspace.findFiles(glob, null, 100).then((uris: vscode.Uri[] ) => {         
   uris.forEach((uri: vscode.Uri) => {              
         console.log(uri);
   });
}); 

由于某种原因,以上代码虽然返回0 uris。 关于我必须如何格式化全局以实现此目的的想法? 和/或是否有更好的方法?

😊👋🏻我想你冤wrong了世界。 我发现了这个有关Glob模式组成的引人入胜的Wiki

        let inputAsWorkspaceRelativeFolder = 'asset'; // for example, would return: '/home/me/my-vs-project/assets' for input of './assets'

        //https://github.com/ev3dev/vscode-ev3dev-browser/wiki/Glob-Patterns
        let glob = '**/'+inputAsWorkspaceRelativeFolder+'/*.*';//or +'/{*.png,*.jpeg}';

或者您可以使用内置的fs节点


import * as fs from 'fs';
        fs.readdir(inputAsWorkspaceRelativeFolder, (err, files: string[]) => {
            files.forEach((file: path) => {
                const uri = vscode.Uri.file(file);
                console.log(uri);
            });
        });

如果您要获取资产文件夹中的所有文件并且不想过滤扩展名,则更简单。

我可以使用vscode.RelativePattern来做到这vscode.RelativePattern -我敢肯定我可以使用通用的GlobPatterns来做到这一点,但是我仍然不清楚在匹配文件时findFiles(..)认为'root'是什么。 RelativePattern 显式相对于工作空间根目录。

let workspaceFolder: vscode.WorkspaceFolder | undefined = vscode.workspace.getWorkspaceFolder(document.uri);

        if (!workspaceFolder || document.isUntitled) {
            return undefined;
        }

        // Workspace folder: /home/me/my-project
        let workspaceFolderPath: string = workspaceFolder.uri.path;

        let relativeSearchFolderPrefix = path.normalize(path.dirname(document.uri.path) + '/' + searchText);
        relativeSearchFolderPrefix = path.relative(workspaceFolderPath, relativeSearchFolderPrefix);

            let relativePattern: vscode.RelativePattern = new vscode.RelativePattern(
                workspaceFolderPath,
                relativeSearchFolderPrefix + '/**/*.{png,jpeg,jpg,gif}');

return vscode.workspace.findFiles(globPattern, null, 50).then((uris: vscode.Uri[] ) => {            
            let relativePaths: string[] = [];

            uris.forEach((uri: vscode.Uri) => {             
                relativePaths.push(path.relative(current, uri.path));
            });

            // trivial custom function that turns an array of strings into CompletionItems
            return getCompletionItems(relativePaths, vscode.CompletionItemKind.File);
        }); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM