我正在尝试从目录递归读取文件并尝试使用以下代码。
readDirFiles.list('/dir/subDir/', 'utf8', function (err, filenames) {
if (err) return console.dir(err);
//filenames haslist of all files and dirs in '/dir/subDir/'
if(filenames){
filenames.forEach(function(filename) {
//filename is full path of file and array also contains sub directory paths
try {
console.log('Opening file '+ filename);
fileContents = fs.readFileSync(filename, 'utf8');
console.log(md5(fileContents));
} catch (err) {
console.log(err);
}
}, this);
}
});
在filenames
中我列出了所有文件和目录,我只想从中读取文件和跳过目录。当我尝试使用fs.readFileSync(filename, 'utf8')
读取文件时,它给了我两个错误
1. { [Error: EISDIR: illegal operation on a directory, read] errno: -21, code: 'EISDIR', syscall: 'read' }
这个是好的,因为它试图读取目录而不是文件。
2。[ReferenceError: fileContents is not defined]
不知道为什么会出现这个错误,因为我正确传递了正确的文件路径。
答案 0 :(得分:1)
在读取文件之前,应检查路径是目录还是文件路径。
使用fs.statSync(path).isDirectory()检查它是否是目录并忽略它。
答案 1 :(得分:1)
您的脚本顶部可能有'use strict'
,由于您没有正确声明fileContents
,因此您收到了参考错误。
要修复,请使用适当的变量声明:
let fileContents = fs.readFileSync(filename, 'utf8');
答案 2 :(得分:1)
由于目录读取失败,因为它不是文件,因此fileContents变量未定义,md5失败,[ReferenceError: fileContents is not defined]
。您应该使用fs.statSync(path).isDirectory()
答案 3 :(得分:0)
fs.readFileSync()
需要文件的完整路径,而不仅仅是名称。 filenames
返回的list
只是一个文件名列表,而不是完整路径。fileContents
未定义为错误。要检查filename
是否为文件,您需要先使用fs.stat()
。
const fs = require('fs');
const path = require('path');
const dir = '/dir/subDir/';
fs.readdir(dir, function (err, filenames) {
if (err) {
return console.dir(err);
}
// `filenames` haslist of all file names only.
Promise.all(filenames.map(filename => new Promise((resolve, reject) => {
const filePath = path.join(dir, filename);
console.log('Opening file '+ filePath);
fs.stat(filePath, (err, stats) => {
if (err) {
return reject(err);
}
if (stats.isFile()) {
const fileContents = fs.readFileSync(filePath, 'utf8');
console.log(md5(fileContents));
}
resolve();
});
})));
});