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()来检查它是否是一个目录并且忽略它。

  1. fs.readFileSync()需要文件的完整path,而不仅仅是名称。 list返回的filenames只是文件名列表,而不是完整的path。
  2. 您的示例中的fileContents未定义为错误所述。
  3. 要检查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(); }); }))); });