Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.08.2018, 11:14
Аспирант
Отправить личное сообщение для Tipylja Посмотреть профиль Найти все сообщения от Tipylja
 
Регистрация: 17.04.2017
Сообщений: 72

Цикл по файловой системе
Здравствуйте. Есть каталог и вложенные в него каталоги, которые содержат фотографии, мне необходимо перебрать все файлы в этих каталогах, обработать фотографии и положить в другой каталог, но при этом сохранить структуру. Если каталог один и в нем файлы то это просто сделать:
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);
        });

     });

Подскажите, как пройтись в цикле так, что бы перебрать и вложенные каталоги, при этом и сохранить эту иерархию
Ответить с цитированием
  #2 (permalink)  
Старый 14.08.2018, 13:19
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,010

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

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

если это дело по замыслу должно работать на сервере, то лучше юзать асинхронные варианты функций
Ответить с цитированием
  #3 (permalink)  
Старый 21.08.2018, 14:24
Аспирант
Отправить личное сообщение для stweet Посмотреть профиль Найти все сообщения от stweet
 
Регистрация: 21.12.2011
Сообщений: 41

Чет типа того.
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)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл завершается не дожидаясь выполнения функции leonoff jQuery 2 13.08.2014 16:02
Как подчинить себе цикл wreder jQuery 17 20.11.2013 22:17
Цикл завешивает страницу, помогите Romingood jQuery 5 19.10.2013 14:30
как сделать чтобы цикл не запускался второй раз Brook Events/DOM/Window 5 12.05.2013 21:43
Бесконечный цикл Sundro Общие вопросы Javascript 8 08.08.2011 13:58