【问题标题】:Javascript sum directory size inside a foreachforeach中的Javascript总和目录大小
【发布时间】:2018-10-22 15:45:36
【问题描述】:

每次调用 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

【问题讨论】:

  • 那么哪一行应该对所有大小求和或将当前文件的大小添加到总和中?
  • 我已经注释了上面的代码,很抱歉忘记了...
  • size = +size 除了将变量 size 转换为数字之外,什么也不做。你的意思是size += size?即使这样,您稍后也会覆盖该值 - 您不能使用相同的变量同时保存当前大小和总大小。
  • 更新了代码,是不是更好?
  • 不多,因为totalSize 是一个局部变量,在每次迭代结束时都会丢失,而且无论如何您都不会对它做任何事情。

标签: javascript node.js foreach


【解决方案1】:

您在错误的地方计算总大小,并且计算方式也错误。 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);
}

【讨论】:

    【解决方案2】:

    无需重新发明轮子(:

    有很多方法可以实现:

    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);
    });
    

    【讨论】:

      猜你喜欢
      • 2013-09-29
      • 2021-02-11
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 2010-12-16
      • 1970-01-01
      相关资源
      最近更新 更多