【问题标题】:How to get filename from multiple directories using fs in nodejs?如何在nodejs中使用fs从多个目录中获取文件名?
【发布时间】:2017-08-07 18:54:12
【问题描述】:

一旦我有了进一步的代码实现,我想从所有目录中获取文件信息,但我被困在这里并收到错误粘贴有问题的任何想法在下面的代码中实现了什么错误?

cron.js

var fs = require('fs');
var path = require('path');
var async = require('async');
var directories = ['./logs/dit', './logs/st','./logs/uat']
function cronJob() {
directories.forEach(function(dir){
    var files = fs.readdir(dir);
    async.eachSeries(files, function(file,callback) {
            var filePath = path.join(dirPath, file);
            var fileInfo = {};
            fs.stat(filePath, function(err, stats) {
               if (err) {
                 console.info("File doesn't");
                } else {
                 fileInfo.fileDate = stats.birthtime;
                 fileInfo.filename = file;
                 console.log(fileInfo);
//                 compareDates(fileInfo,filePath);
//                 callback();
               }
            });
        });
})

}

cronJob();

错误

s\Ulog-0\ulog\app\serverfiles\logs\dit'
  at Error (native)
  at Object.fs.readdirSync (fs.js:808:18)
  at C:\Users\WebstormProjects\Ulog-0\ulog\app\serverfiles\cronJob
20
  at Array.forEach (native)
  at cronJob (C:\Users\WebstormProjects\Ulog-0\ulog\app\serverfile
obs.js:7:13)
  at Object.<anonymous> (C:\Users\\WebstormProjects\Ulog-0\ulog\app

【问题讨论】:

  • 您可能应该异步读取目录,以免出现意外行为。

标签: javascript arrays node.js fs


【解决方案1】:

readdir 是异步的,所以你需要等待它的回调来执行进一步的操作。

很难知道到底是什么问题,所以我已经包含了日志语句。

编辑

var fs = require('fs');
var path = require('path');
var async = require('async');
var directories = ['/../../logs/dit', '/../../logs/st', '/../../logs/uat'];

// loop through each directory
async.eachSeries(directories, function (dir, cb1) {
    var dir = __dirname + dir;
    console.log('reading', dir);
    // get files for the directory
    fs.readdir(dir, function (err, files) {
        if (err) return cb1(err);

        // loop through each file
        async.eachSeries(files, function (file, cb2) {
            var filePath = path.resolve(dir + '/' + file);
            // get info for the file
            fs.stat(filePath, function (err, stats) {
                if (err) return cb2(err);
                var fileInfo = { fileDate: stats.birthtime, filename: file };
                console.log('fileInfo', fileInfo);
                compareDates(fileInfo, filePath);
                cb2(null, fileInfo);
            });
        }, cb1);

    });
}, function (err, fileInfos) {
    if (err) {
        console.info('error', err);
        return;     
    }
    // when you're done reading all the files, do something...
});

【讨论】:

  • 收到此错误C:\Users\sh529u\WebstormProjects\Ulog-0\ulog\app\serverfiles&gt;node cronJobs.j reading ./logs/dit dir error { [Error: ENOENT: no such file or directory, scandir 'C:\Users\sh5 WebstormProjects\Ulog-0\ulog\app\serverfiles\logs\dit'] errno: -4058, code: 'ENOENT', syscall: 'scandir', path: 'C:\\Users\\sh529u\\WebstormProjects\\Ulog-0\\ulog\\app\\serverfiles
  • logs 文件夹位于根级别,功能为app/serverfiles/cronJob.js
  • 好吧,你知道问题出在哪里了。它与 directories 数组中的路径有关。 This answer 可能会帮助您解决这个问题。
  • 这真的让我很困惑,我是 nodejs 的新手,如果你能帮我解决这个问题,我会很感激的
  • 查看我的编辑。我改变了一些逻辑。特别是,我更改了 directories 数组。确保路径相对于当前目录。如果logs 位于根级别(假设与app 相同级别),那么您需要将/../../ 向上移动两个级别。还要注意使用__dirname 来知道从哪里开始。随便玩弄路径,最终你会得到它。
猜你喜欢
  • 2016-12-27
  • 2017-08-06
  • 2020-09-02
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多