Node.js: Как проверить, является ли папка пустой или нет, без загрузки списка файлов

Я использую Node.js .

Я хочу проверить, что папка пуста или нет? Один из вариантов - использовать fs.readdir , но он загружает целую кучу файлов в массив. У меня более 10000 файлов в папке. Имя загружаемых файлов бесполезно, чтобы проверить, пуста или нет папка. Так что искать альтернативное решение.

14

5 ответы

Это уродливый хак, но я все равно выброшу его. Вы можете просто вызвать fs.rmdir в каталоге. Если обратный вызов возвращает ошибку, содержащую код : «ENOTEMPTY» , он не был пустым. Если это удастся, вы можете вызвать fs.mkdir и заменить его. Это решение, вероятно, имеет смысл только в том случае, если ваш скрипт был тем, который создал каталог в первую очередь, имеет соответствующие разрешения и т. Д.

9
добавлено

Как об использовании узлов native fs module http://nodejs.org/api /fs.html#fs_fs_readdir_path_callback . Это readdir и readdirSync функции предоставляют вам массив всех включенных имен файлов (исключая . и .. ). Если длина 0 , то ваш каталог пуст.

8
добавлено
Он хочет избежать вызова fs, readdir (), потому что целевой каталог может содержать много файлов .
добавлено автор Mupparthy Ravindranath, источник
Я знаю, но в то время, когда вопрос был отправлен, это не было обязательным требованием. Я думал, что оставлю его для справки.
добавлено автор Jonathan Grupp, источник

Вы можете выполнить любую команду * nix shell из NodeJS с помощью exec (). Поэтому для этого вы можете использовать старую добрую папку 'ls -A $ {folder} | wc -l '(в котором перечислены все файлы/каталоги, содержащиеся в $ {папке}, скрывающие записи для текущего каталога (.) и родительского каталога (..) из вывода, который вы хотите исключить из подсчета, и подсчета их номер).

Например, в случае, если ./tmp не содержит файлов/каталогов ниже, будет показано «Каталог ./tmp пуст». В противном случае будет показано количество файлов/каталогов, которые оно содержит.

var dir = './tmp';
exec( 'ls -A ' + dir + ' | wc -l', function (error, stdout, stderr) {
    if( !error ){
        var numberOfFilesAsString = stdout.trim();
        if( numberOfFilesAsString === '0' ){
            console.log( 'Directory ' + dir + ' is empty.' );
        }
        else {
            console.log( 'Directory ' + dir + ' contains ' + numberOfFilesAsString + ' files/directories.' );
        }
    }
    else {
        throw error;
    }
});
4
добавлено
plusone: Это «лучший» способ достичь цели, учитывая обстоятельства.
добавлено автор L0j1k, источник

Также как добавить, что есть модуль узла extfs , который можно использовать для проверки того, что каталог пуст используя функцию isEmpty() , как показано фрагментом кода ниже:

var fs = require('extfs');

fs.isEmpty('/home/myFolder', function (empty) {
  console.log(empty);
});

Проверьте ссылку на документацию относительно синхронной версии этой функции.

0
добавлено
Функция extfs 'isEmpty также внутренне использует fs.readDir. Таким образом, он будет загружать все имена файлов. github.com/codexar/npm-extfs/blob/ ведущий/extfs.js # L65-70
добавлено автор Shubhansh, источник

What about globbing? ie, exists myDir/*. It is not supported out of box by node (TOW v0.10.15), but bunch of modules will do that for you, like minimatch

0
добавлено
pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

Node.js — русскоговорящее сообщество
Node.js — русскоговорящее сообщество
4 160 участник(ов)

Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было комфортным. Правила: https://rudevs.network/ByaMH6un7 См. также: @js_ru, @react_js, @angular_ru, @vuejs_ru, @devops_ru Вакансии и поиск работы: @javascript_jobs и @nodejs_jobs

Node: русскоязычное сообщество
Node: русскоязычное сообщество
28 участник(ов)

Независимое сообщество node разработчиков на русском языке. Правила: https://node-chat.ru/ Партнеры: @react_ru @ru_vuejs @nuxtjs_ru @ru_docker @nlp_ru