Размер каталога суммы Javascript внутри foreach - PullRequest
0 голосов
/ 12 мая 2018

У меня проблемы с увеличением переменной каждый раз, когда вызывается forEach.

Цель состоит в том, чтобы получить общий размер каталога путем суммирования размера всех файлов внутри него. Проблема, которая у меня есть, состоит в том, чтобы правильно понять, куда я должен поместить переменные, чтобы вычислить правильный размер.

Действительно, на данный момент рассчитанный размер - это размер отдельных файлов, а не общий размер. Чего мне не хватает?

function walk(dir) {
  let
    n = 0,
    size = 0,
    totalSize = 0;

  function walk(dir) {

    fs.readdirSync(dir).forEach(file => {

      let fullPath = path.join(dir, file);


      totalSize += size; //Total size ; should it be here ?
      ++n;

      console.log(size);

      if (fs.lstatSync(fullPath).isDirectory()) {
        --n;
        walk(fullPath);
      } else {
        size = fs.statSync(fullPath).size; // Get size of file
        listFiles.write(size + "\n"); // Write file size into copyList.xml
      }

    });
  }
  return walk(dir);
}

Токовый выход:

340747217
18607
283163346
25332
287107119
22240
281853153
219100996
204879388
210185951
26321
278784426
21899
22695
238503727
29866
266805926
21697
285134805

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Не нужно изобретать велосипед (:

Есть множество способов достичь этого:

1) Вызов команды и получение вывода:

du -s YourPathHere | cut -f1

с JS:

const { exec } = require('child_process');
exec('du -s YourPathHere | cut -f1', (error, stdout, stderr) => {
  if (error) {
    throw error;
  }

  console.log(parseInt(stdout));
});    

2) Просто используйте модуль get-folder-size , он асинхронный из коробки (не использует *Sync методы)

const {promisify} = require('util');
const getFolderSize = promisify(require('get-folder-size'));

(async () => {
  try {
    const size = await getFolderSize('/your-path');
  }
  catch(error) {
    console.error(error);
  }  
});

или обратный вызов:

const getFolderSize = require('get-folder-size');

getFolderSize(myFolder, (error, size) => {
  if (error) { 
    throw error; 
  }

  console.log(size);
});
0 голосов
/ 12 мая 2018

Вы рассчитываете общий размер в неправильном месте, а также неверный способ расчета. size = + size не добавляет новый размер к существующему значению. Используйте новую переменную для накопления общего размера. (totalSize)

function walk(dir) {
  let n = 0,
     size = 0;
     totalSize = 0;

  function walk(dir) {
      fs.readdirSync(dir).forEach(file => {
      let fullPath = path.join(dir, file);
      ++n;

      if (fs.lstatSync(fullPath).isDirectory()) {
          --n;
          walk(fullPath);
      } else {
          size = fs.statSync(fullPath).size; // Get size of file
          totalSize += size; // Calculate total size
          listFiles.write(size + "\n"); // Write file size into copyList.xml
      }
    });
  }
  return walk(dir);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...