fs.readFileSync ReferenceError:fileContents未定义
我试图从目录recursion读取文件,并尝试下面的代码。
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]
知道为什么这个错误来了,因为我正确的扩展名传递正确的文件path。
您的脚本可能在顶部'use strict'
,并且由于您没有正确地声明fileContents
,所以会出现引用错误。
要修复,请使用适当的variables声明:
let fileContents = fs.readFileSync(filename, 'utf8');
由于目录读取失败,因为它不是一个文件,您的fileContentsvariables是未定义的,并且md5失败, [ReferenceError: fileContents is not defined]
。 你应该使用上面提出的检查使用fs.statSync(path).isDirectory()
在读取文件之前,您应该检查path是目录还是文件path。
使用fs.statSync(path).isDirectory()来检查它是否是一个目录并且忽略它。
-
fs.readFileSync()
需要文件的完整path,而不仅仅是名称。list
返回的filenames
只是文件名列表,而不是完整的path。 - 您的示例中的
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(); }); }))); });