файловая система.stat не удается идентифицировать существующие файлы

Я используюasync.each, чтобы проверить массив из 180 имен файлов, используяfs.stat, чтобы проверить, что физический файл существует. В настоящее время все файлы существуют, и все же каждый раз, когда я вызываю этот код, 3 из 180 изображений оказываются fs.statнесуществующими. Изображения, которые он не может найти, немного различаются при каждом вызове.

Первое изображение, которое не удается найти, всегда находится около 70-го имени файла в массиве. Если я уменьшу размер массива до списка (например) 50 имен, то все изображения будут найдены.

// ImagesToCheck is an array of 180 filepaths, all of which exist on the server

var index = 0

async.each(ImagesToCheck,
function(item, cb) {

    fs.stat(item, function(error, value) {
        if (error) {
            // Logs "ENOENT: no such file or directory"
            console.log("error is "+error)
            // this is logging the correct filename, which DOES exist
            console.log("filename is "+ImagesToCheck[index]) 

            Speakers[index].speaker_image_url = null
            index++
            cb()
        } 
        else {
            // Image exists
            // console.log("image exists " + index)
            Speakers[index].speaker_image_url = "http://www.apiurl.co.uk/images/seminar_image-" + rows[index].seminar_id + ".jpg"
            index++
            cb()
        }
    }) // close fs.stat
},
function(err) {
    // sends the array of URLs
    callBack(Speakers)
})

// Теперь используется fs.открыть вместо fs.stat, с асинхронной.forEachOf, и получать по существу такой же результат:

var index = 0

async.forEachOf(ImagesToCheck,
    function(item, key, cb) {

        fs.open(item, 'r', function(error, value) {
            if (error) {
                // Logs "ENOENT: no such file or directory"
                console.log("error is " + error)
                    // this is logging the correct filename, which DOES        exist
                console.log("index is " + index + ", filename is " +  ImagesToCheck[index])
                Speakers[index].speaker_image_url = null
                index++
                return cb()
            }

            // if no error
            Speakers[index].speaker_image_url =   "http://www.apiurl.co.uk/images/seminar_image-" + rows[index].seminar_id + ".jpg"
            index++
            cb()
        })
    },
    function(err) {
    // send the array of urls
    callBack(Speakers)
    }
)

1 ответ

  1. Примечание: это просто, чтобы показать реализацию теста. Это не предназначено в качестве ответа

    Просто попытался сгенерировать 200 файлов (0.txt, 1.формат txt… 200.txt) в папке с именемfiles, и попробовал этот код:

    'use strict';
    
    const fs = require('fs'),
        async = require('async');
    
    let files = [],
        results = [],
        i = 0;
    
    while(i < 200) {
        files.push('./files/' + i + '.txt');
        i = i + 1;
    }
    
    async.eachOf(files, (file, i, callback) => {
        fs.stat(file, (err, stats) => {
            files[i] = !err;
            callback();
        });
    }, () => {
        let notFound = files.filter((f) => {
            return !f;
        });
        console.log('fs.stat didn\'t found ' + notFound.length + '/200 files');
        files.map((f, i) => {
            if(!f) {
                console.log('File ' + i + ' wasn\'t found');
            }
        })
    });
    

    Ошибка не найдена, кажется, проблема не fs.stat