Получить все файлы рекурсивно в каталогах NodejS
У меня небольшая проблема с моей функцией. Я хотел бы получить все файлы во многих каталогах. В настоящее время я могу получить файлы в файле, переданном в параметрах. Я хотел бы получить html-файлы каждой папки в папке, переданной в качестве параметра. Я объясню, если я введу параметр "test", я получу файлы в" test", но я хотел бы получить " test / 1 / *. Html", " test / 2/. /.html":
var srcpath2 = path.join('.', 'diapo', result);
function getDirectories(srcpath2) {
return fs.readdirSync(srcpath2).filter(function (file) {
return fs.statSync(path.join(srcpath2, file)).isDirectory();
});
}
результат : [1,2,3]
спасибо !
5 ответов
похоже glob
пакет npm поможет вам. Вот пример того, как его использовать:
иерархия файл:
test
├── one.html
└── test-nested
└── two.html
JS код:
var getDirectories = function (src, callback) {
glob(src + '/**/*', callback);
};
getDirectories('test', function (err, res) {
if (err) {
console.log('Error', err);
} else {
console.log(res);
}
});
, который отображает:
[ 'test/one.html',
'test/test-nested',
'test/test-nested/two.html' ]
Мне нужно было так что-то подобное, в электронном приложении: получить все подпапки в данной базовой папке, используя TypeScript, и придумал это:
import { readdirSync, statSync, existsSync } from "fs";
import * as path from "path";
// recursive synchronous "walk" through a folder structure, with the given base path
getAllSubFolders = (baseFolder, folderList = []) => {
let folders:string[] = readdirSync(baseFolder).filter(file => statSync(path.join(baseFolder, file)).isDirectory());
folders.forEach(folder => {
folderList.push(path.join(baseFolder,folder));
this.getAllSubFolders(path.join(baseFolder,folder), folderList);
});
}
вот моя. Как и все хорошие ответы трудно понять:
const isDirectory = path => statSync(path).isDirectory();
const getDirectories = path =>
readdirSync(path).map(name => join(path, name)).filter(isDirectory);
const isFile = path => statSync(path).isFile();
const getFiles = path =>
readdirSync(path).map(name => join(path, name)).filter(isFile);
const getFilesRecursively = (path) => {
let dirs = getDirectories(path);
let files = dirs
.map(dir => getFilesRecursively(dir)) // go through each directory
.reduce((a,b) => a.concat(b), []); // map returns a 2d array (array of file arrays) so flatten
return files.concat(getFiles(path));
};
вы также можете написать свой собственный код, как показано ниже, чтобы пересечь каталог, как показано ниже:
var fs = require('fs');
function traverseDirectory(dirname, callback) {
var directory = [];
fs.readdir(dirname, function(err, list) {
dirname = fs.realpathSync(dirname);
if (err) {
return callback(err);
}
var listlength = list.length;
list.forEach(function(file) {
file = dirname + '\' + file;
fs.stat(file, function(err, stat) {
directory.push(file);
if (stat && stat.isDirectory()) {
traverseDirectory(file, function(err, parsed) {
directory = directory.concat(parsed);
if (!--listlength) {
callback(null, directory);
}
});
} else {
if (!--listlength) {
callback(null, directory);
}
}
});
});
});
}
traverseDirectory(__dirname, function(err, result) {
if (err) {
console.log(err);
}
console.log(result);
});
вы можете проверить больше информации о нем здесь: http://www.codingdefined.com/2014/09/how-to-navigate-through-directories-in.html
const fs = require('fs');
const path = require('path');
var filesCollection = [];
const directoriesToSkip = ['bower_components', 'node_modules', 'www', 'platforms'];
function readDirectorySynchronously(directory) {
var currentDirectorypath = path.join(__dirname + directory);
var currentDirectory = fs.readdirSync(currentDirectorypath, 'utf8');
currentDirectory.forEach(file => {
var fileShouldBeSkipped = directoriesToSkip.indexOf(file) > -1;
var pathOfCurrentItem = path.join(__dirname + directory + '/' + file);
if (!fileShouldBeSkipped && fs.statSync(pathOfCurrentItem).isFile()) {
filesCollection.push(pathOfCurrentItem);
}
else if (!fileShouldBeSkipped) {
var directorypath = path.join(directory + '\' + file);
readDirectorySynchronously(directorypath);
}
});
}
readDirectorySynchronously('');
это заполнит filesCollection все файлы в каталоге и его подкаталогах (это рекурсивно). У вас есть возможность пропустить некоторые имена каталогов в directoriesToSkip массив.