Javascript 仅使用节点以递归方式列出路径中的目录
我试图用一种优雅的方式递归列出其中的所有目录和文件。我想列出每个目录/子目录下的文件,以便区分它们。并且目录路径必须由用户提供。我的努力如下,代码是完全可复制的,但我一直得到空目录,文件被多次列出。有什么更好的方法可以完成这里的列表Javascript 仅使用节点以递归方式列出路径中的目录,javascript,node.js,ecmascript-6,es6-promise,fs,Javascript,Node.js,Ecmascript 6,Es6 Promise,Fs,我试图用一种优雅的方式递归列出其中的所有目录和文件。我想列出每个目录/子目录下的文件,以便区分它们。并且目录路径必须由用户提供。我的努力如下,代码是完全可复制的,但我一直得到空目录,文件被多次列出。有什么更好的方法可以完成这里的列表 //server.js "use strict"; const fs = require("fs"); const rlp = require("readline"); const path = require("path"); const filesReadSer
//server.js
"use strict";
const fs = require("fs");
const rlp = require("readline");
const path = require("path");
const filesReadService = require("./filesReadService");
const handleFolders = require("./handleFolders");
// var basePath = "C:\\Users\\My Computer\\Videos\\Captures";
const rl = rlp.createInterface({
input: process.stdin,
output: process.stdout
});
function directoryInput() {
return new Promise((resolve, reject) => {
rl.question("Please enter a valid directory: ", input => resolve(input));
});
}
directoryInput().then(async userInput => {
rl.close();
let filesAndFolders = await handleFolders(userInput);
await filesReadService(userInput, filesAndFolders);
});
我至少需要使用ES6。您打算使用什么ES6功能?高阶函数、箭头函数等等。此外,什么是walkDir?代码抛出一个错误:“walkDir未定义”编辑:不必介意“Credits”将其清除,但它仍然抛出一个错误:“返回binding.read(fd,buffer,offset,length,position);(^points on read)错误:EISDIR:目录上的非法操作,read”您可以容纳共享的代码,将其转换为箭头函数。你原来的帖子并没有强调如何使用它。我已经修复了输入错误并更改了函数调用,因此它使用了当前目录。将文件放在您希望递归列出的目录中,它就会工作。我做了测试,它对我很有效。我很高兴您能够更改为异步流。:)
//handleFolders.js
const fs = require("fs");
const handleFolders = (directory, isRecursive) => {
return new Promise((resolve, reject) => {
fs.readdir(directory, (err, files) => {
if (err) {
reject(err);
return;
}
resolve(files);
});
});
};
module.exports = handleFolders;
//filesReadService.js
"use strict";
const fs = require("fs");
const path = require("path");
const handleFolders = require("./handleFolders");
const filesReadService = async (directoryPath, files) => {
let fullPath;
let obj = {};
var promises = files.map(file => {
fullPath = path.join(directoryPath, file);
return new Promise((resolve, reject) => {
fs.stat(fullPath, (err, stat) => {
if (err) {
reject(err);
return;
}
if (stat.isFile()) {
obj = {
file,
isFile: true
};
} else if (stat.isDirectory()) {
obj = {
file,
isFolder: true
};
}
resolve(obj);
});
});
});
Promise.all(promises).then(
values => {
console.log("The files in this directory:");
values
.filter(value => value.isFile)
.forEach(value => console.log(value.file));
console.log("\nThe folders in this directory:");
values
.filter(value => value.isFolder === true)
.forEach(async value => {
let folderPath = path.join(directoryPath, value.file);
let foldersAndFiles = await handleFolders(folderPath, true);
console.log(value.file, ":\t", foldersAndFiles);
await filesReadService(folderPath, foldersAndFiles);
});
},
err => {
console.log(err);
}
);
};
module.exports = filesReadService;
const fs = require("fs"), path = require("path");
function recursivelyListDir(dir, callback) {
fs.readdirSync(dir).forEach(f => {
let dirPath = path.join(dir, f);
let isDirectory = fs.statSync(dirPath).isDirectory();
isDirectory
? recursivelyListDir(dirPath, callback)
: callback(path.join(dir, f));
});
}
// Function Usage.
recursivelyListDir(__dirname, function(filePath) {
const fileContents = fs.readFileSync(filePath, "utf8");
console.log(filePath);
});