Node.js: Как проверить, что папка пуста или нет, без загрузки списка файлов
Я использую Node.js
.
Я хочу проверить, что папка пуста или нет? Один из вариантов - использовать fs.readdir, но он загружает целую кучу файлов в массив.
У меня более 10000 файлов в папке. Имя загружаемых файлов бесполезно, чтобы проверить, пуста или нет папка. Поэтому поиск альтернативного решения.
Ответы
Ответ 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);
});
Проверьте ссылку на документацию относительно синхронной версии этой функции.