eae5d8c807
These conflicts will be resolved in the following commits. We do it this way so that PR review is possible.
86 lines
2.3 KiB
TypeScript
86 lines
2.3 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import * as fs from 'fs';
|
|
import { Uri } from 'vscode';
|
|
import { RequestService, FileType } from '../requests';
|
|
|
|
export function getNodeFSRequestService(): RequestService {
|
|
function ensureFileUri(location: string) {
|
|
if (!location.startsWith('file://')) {
|
|
throw new Error('fileRequestService can only handle file URLs');
|
|
}
|
|
}
|
|
return {
|
|
getContent(location: string, encoding?: string) {
|
|
ensureFileUri(location);
|
|
return new Promise((c, e) => {
|
|
const uri = Uri.parse(location);
|
|
fs.readFile(uri.fsPath, encoding, (err, buf) => {
|
|
if (err) {
|
|
return e(err);
|
|
}
|
|
c(buf.toString());
|
|
|
|
});
|
|
});
|
|
},
|
|
stat(location: string) {
|
|
ensureFileUri(location);
|
|
return new Promise((c, e) => {
|
|
const uri = Uri.parse(location);
|
|
fs.stat(uri.fsPath, (err, stats) => {
|
|
if (err) {
|
|
if (err.code === 'ENOENT') {
|
|
return c({ type: FileType.Unknown, ctime: -1, mtime: -1, size: -1 });
|
|
} else {
|
|
return e(err);
|
|
}
|
|
}
|
|
|
|
let type = FileType.Unknown;
|
|
if (stats.isFile()) {
|
|
type = FileType.File;
|
|
} else if (stats.isDirectory()) {
|
|
type = FileType.Directory;
|
|
} else if (stats.isSymbolicLink()) {
|
|
type = FileType.SymbolicLink;
|
|
}
|
|
|
|
c({
|
|
type,
|
|
ctime: stats.ctime.getTime(),
|
|
mtime: stats.mtime.getTime(),
|
|
size: stats.size
|
|
});
|
|
});
|
|
});
|
|
},
|
|
readDirectory(location: string) {
|
|
ensureFileUri(location);
|
|
return new Promise((c, e) => {
|
|
const path = Uri.parse(location).fsPath;
|
|
|
|
fs.readdir(path, { withFileTypes: true }, (err, children) => {
|
|
if (err) {
|
|
return e(err);
|
|
}
|
|
c(children.map(stat => {
|
|
if (stat.isSymbolicLink()) {
|
|
return [stat.name, FileType.SymbolicLink];
|
|
} else if (stat.isDirectory()) {
|
|
return [stat.name, FileType.Directory];
|
|
} else if (stat.isFile()) {
|
|
return [stat.name, FileType.File];
|
|
} else {
|
|
return [stat.name, FileType.Unknown];
|
|
}
|
|
}));
|
|
});
|
|
});
|
|
}
|
|
};
|
|
}
|