Path: blob/main/extensions/css-language-features/client/src/node/nodeFs.ts
3322 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as fs from 'fs';6import { Uri } from 'vscode';7import { RequestService, FileType } from '../requests';89export function getNodeFSRequestService(): RequestService {10function ensureFileUri(location: string) {11if (!location.startsWith('file://')) {12throw new Error('fileRequestService can only handle file URLs');13}14}15return {16getContent(location: string, encoding?: BufferEncoding) {17ensureFileUri(location);18return new Promise((c, e) => {19const uri = Uri.parse(location);20fs.readFile(uri.fsPath, encoding, (err, buf) => {21if (err) {22return e(err);23}24c(buf.toString());2526});27});28},29stat(location: string) {30ensureFileUri(location);31return new Promise((c, e) => {32const uri = Uri.parse(location);33fs.stat(uri.fsPath, (err, stats) => {34if (err) {35if (err.code === 'ENOENT') {36return c({ type: FileType.Unknown, ctime: -1, mtime: -1, size: -1 });37} else {38return e(err);39}40}4142let type = FileType.Unknown;43if (stats.isFile()) {44type = FileType.File;45} else if (stats.isDirectory()) {46type = FileType.Directory;47} else if (stats.isSymbolicLink()) {48type = FileType.SymbolicLink;49}5051c({52type,53ctime: stats.ctime.getTime(),54mtime: stats.mtime.getTime(),55size: stats.size56});57});58});59},60readDirectory(location: string) {61ensureFileUri(location);62return new Promise((c, e) => {63const path = Uri.parse(location).fsPath;6465fs.readdir(path, { withFileTypes: true }, (err, children) => {66if (err) {67return e(err);68}69c(children.map(stat => {70if (stat.isSymbolicLink()) {71return [stat.name, FileType.SymbolicLink];72} else if (stat.isDirectory()) {73return [stat.name, FileType.Directory];74} else if (stat.isFile()) {75return [stat.name, FileType.File];76} else {77return [stat.name, FileType.Unknown];78}79}));80});81});82}83};84}858687