Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

Вы можете выполнить любую команду * 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

Как насчет глотания? т.е. exists myDir/*. Он не поддерживается из коробки node (TOW v0.10.15), но куча модулей сделает это для вас, например minimatch

Ответ 5

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

var fs = require('extfs');

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

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