diff --git a/src/vs/platform/diagnostics/node/diagnosticsService.ts b/src/vs/platform/diagnostics/node/diagnosticsService.ts index 2f27114408f..c975790fa99 100644 --- a/src/vs/platform/diagnostics/node/diagnosticsService.ts +++ b/src/vs/platform/diagnostics/node/diagnosticsService.ts @@ -5,7 +5,7 @@ import * as osLib from 'os'; import { virtualMachineHint } from 'vs/base/node/id'; import { IMachineInfo, WorkspaceStats, WorkspaceStatItem, PerformanceInfo, SystemInfo, IRemoteDiagnosticInfo, IRemoteDiagnosticError, isRemoteDiagnosticError, IWorkspaceInformation } from 'vs/platform/diagnostics/common/diagnostics'; -import { readdir, exists, readFile } from 'fs'; +import { Dirent, exists, readFile } from 'fs'; import { join, basename } from 'vs/base/common/path'; import { parse, ParseError, getNodeType } from 'vs/base/common/json'; import { listProcesses } from 'vs/base/node/ps'; @@ -19,6 +19,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { Iterable } from 'vs/base/common/iterator'; import { Schemas } from 'vs/base/common/network'; import { ByteSize } from 'vs/platform/files/common/files'; +import { readdir } from 'vs/base/node/pfs'; export const ID = 'diagnosticsService'; export const IDiagnosticsService = createDecorator(ID); @@ -79,68 +80,69 @@ export async function collectWorkspaceStats(folder: string, filter: string[]): P function collect(root: string, dir: string, filter: string[], token: { count: number, maxReached: boolean }): Promise { const relativePath = dir.substring(root.length + 1); - return new Promise(resolve => { - readdir(dir, { withFileTypes: true }, async (err, files) => { + return new Promise(async resolve => { + let files: Dirent[]; + try { + files = await readdir(dir, { withFileTypes: true }); + } catch (error) { // Ignore folders that can't be read - if (err) { - resolve(); - return; - } - - if (token.count >= MAX_FILES) { - token.count += files.length; - token.maxReached = true; - resolve(); - return; - } - - let pending = files.length; - if (pending === 0) { - resolve(); - return; - } - - let filesToRead = files; - if (token.count + files.length > MAX_FILES) { - token.maxReached = true; - pending = MAX_FILES - token.count; - filesToRead = files.slice(0, pending); - } + resolve(); + return; + } + if (token.count >= MAX_FILES) { token.count += files.length; + token.maxReached = true; + resolve(); + return; + } - for (const file of filesToRead) { - if (file.isDirectory()) { - if (!filter.includes(file.name)) { - await collect(root, join(dir, file.name), filter, token); - } + let pending = files.length; + if (pending === 0) { + resolve(); + return; + } - if (--pending === 0) { - resolve(); - return; - } - } else { - const index = file.name.lastIndexOf('.'); - if (index >= 0) { - const fileType = file.name.substring(index + 1); - if (fileType) { - fileTypes.set(fileType, (fileTypes.get(fileType) ?? 0) + 1); - } - } + let filesToRead = files; + if (token.count + files.length > MAX_FILES) { + token.maxReached = true; + pending = MAX_FILES - token.count; + filesToRead = files.slice(0, pending); + } - for (const configFile of configFilePatterns) { - if (configFile.relativePathPattern?.test(relativePath) !== false && configFile.filePattern.test(file.name)) { - configFiles.set(configFile.tag, (configFiles.get(configFile.tag) ?? 0) + 1); - } - } + token.count += files.length; - if (--pending === 0) { - resolve(); - return; + for (const file of filesToRead) { + if (file.isDirectory()) { + if (!filter.includes(file.name)) { + await collect(root, join(dir, file.name), filter, token); + } + + if (--pending === 0) { + resolve(); + return; + } + } else { + const index = file.name.lastIndexOf('.'); + if (index >= 0) { + const fileType = file.name.substring(index + 1); + if (fileType) { + fileTypes.set(fileType, (fileTypes.get(fileType) ?? 0) + 1); } } + + for (const configFile of configFilePatterns) { + if (configFile.relativePathPattern?.test(relativePath) !== false && configFile.filePattern.test(file.name)) { + configFiles.set(configFile.tag, (configFiles.get(configFile.tag) ?? 0) + 1); + } + } + + if (--pending === 0) { + resolve(); + return; + } } - }); + } }); }