Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Цикл по файловой системе (https://javascript.ru/forum/node-js-io-js/74882-cikl-po-fajjlovojj-sisteme.html)

Tipylja 14.08.2018 11:14

Цикл по файловой системе
 
Здравствуйте. Есть каталог и вложенные в него каталоги, которые содержат фотографии, мне необходимо перебрать все файлы в этих каталогах, обработать фотографии и положить в другой каталог, но при этом сохранить структуру. Если каталог один и в нем файлы то это просто сделать:
var fs = require('fs')
  , gm = require('gm');

    var data = fs.readdirSync('img');


     data.map(function(item, i, arr) {
       gm('img/' + item)
         .write('opt/' + item, function (err) {
          if (err) console.log(err);
        });

     });

Подскажите, как пройтись в цикле так, что бы перебрать и вложенные каталоги, при этом и сохранить эту иерархию

Alexandroppolus 14.08.2018 13:19

придется делать рекурсивный обход дерева каталогов. Т.е. получили список, проходим по нему, берем fs.statSync, проверяем, что если каталог, то его тоже надо обходить, иначе это файл и работаем с ним как с файлом.

для ускорения можно считать, что если очердное имя заканчивается на ".png" или другое расширение файла-картинки, то это скорее всего файл и statSync делать не надо, сразу обрабатываем.

если это дело по замыслу должно работать на сервере, то лучше юзать асинхронные варианты функций

stweet 21.08.2018 14:24

Чет типа того.
let fs = require('fs'),
	path = require('path')

function read(root) {

	let files = fs.readdirSync(root)
	for(let i = 0; i < files.length; i ++) {

		let name = [root, files[i]].join('/')
			name = path.normalize(name)

		console.log(name)

		let stat = fs.statSync(name)
		if (stat.isDirectory()) {
			read(name)
		}
	}
}

read(__dirname)


Часовой пояс GMT +3, время: 13:10.