Перечисление файлов в папке с расширением vscode - PullRequest
0 голосов
/ 29 июня 2019

Я создаю расширение vscode, которое выполняет произвольное автозаполнение путей к файлам.

Я хочу взять то, что набрал пользователь, и если это значение разрешается в папку в рабочей области, я хочу перечислить все файлы в этой папке для автозаполнения.

Например, дано:

  • рабочее пространство, расположенное по адресу: / home / me / my-vs-project
  • с файлами:
    • / дома / я / мой-против-проекта / активы / dog.png
    • / дом / я / мой-против-проекта / активы / cat.jpeg

Если я введу «assets» или «./assets» в vscode, расширение сможет предоставить мне список автозаполнения:

  • . / Активы / dog.png '
  • . / Активы / 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 юри. Мысли о том, как я должен отформатировать глобус, чтобы это произошло? и / или есть ли лучший подход?

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

Я смог сделать это, используя vscode.RelativePattern - я уверен, что мог бы сделать это, используя универсальные GlobPatterns, но я до сих пор не понимаю, что findFiles(..) считает «корнем» при сопоставлении файлов;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);
        }); 
0 голосов
/ 30 июня 2019

??? Я думаю, что ты обидел шар.Я нашел этот интересный wiki о структуре паттерна Glob.

        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);
            });
        });

Более просто, если хотитечтобы получить все файлы в папке ресурсов и не хотите фильтровать по расширению.

...