文件编号不正确

时间:2018-01-22 09:36:29

标签: javascript node.js increment

我有一个 264420 文件的目录

$ find /Users/Username -type f | wc -l
    264420

我正在尝试使用简单counter++

在Node.js中递归计算文件编号

问题是counter++提供的文件数量不正确,而array.push(file) array.length最终工作正常并且返回正确数量的文件 - 264420

$ node total-files.js

114 'total_files_count' 
264420 'total_files_array_count'

简化的脚本如下所示:

const fs = require('fs')
const path = require('path')
const dir = '/Users/Username'
let totalFiles = 0
let totalFilesArray = []

const totalFilesObj = getFilesRecursively(dir, totalFiles, totalFilesArray)

console.log(totalFilesObj.total_files, 'total_files_count', totalFilesObj.total_files_array.length, 'total_files_array_count')


function getFilesRecursively(dir, totalFiles, totalFilesArray){

    totalFiles = totalFiles || 0
    totalFilesArray = totalFilesArray || []  

    try { var files = fs.readdirSync(dir) }
    catch(err) { console.error(err.message)  }

    for (var i in files) {

        var name = path.join(dir, files[i])

        try {  

            let stats = fs.lstatSync(name)  // track symlink as link, but not as file

            if (stats.isDirectory()) 
                getFilesRecursively(name, totalFiles, totalFilesArray) 

            else if (stats.isFile()) {
                totalFiles++   // why this not working? so we should use .push to array instead?
                totalFilesArray.push(name) 
            }

        } catch(err) { console.error(err.message) }     
    }

    return { "total_files" : totalFiles, "total_files_array" : totalFilesArray }
}

我打算在包含数十万个文件的大型目录上运行脚本,并希望使用计数器增量,这比推送到阵列更快。

请帮助。

2 个答案:

答案 0 :(得分:2)

两个原因

  • 您没有将递归的返回值添加到最终值。
  • 增加原始值不会改变调用函数范围内的值。

成功

if (stats.isDirectory()) 
{
     var returnVal  = getFilesRecursively(name, totalFiles, totalFilesArray);
     totalFiles +=  returnVal.total_files;
}

此外,在方法的开头将totalFiles值设置为0

答案 1 :(得分:0)

@gurvinder372answer

中提出了enter image description here
  

增加原始值并不会重新改变值   呼叫者功能的范围。

因此,在不更改底层代码逻辑且不使用.push的情况下,可能的解决方案之一是创建单值数组并增加该值:

totalFiles++                  ->  totalFiles[0]++
let totalFiles = 0            ->  let totalFiles = [0]
totalFiles = totalFiles || 0  ->  totalFiles = totalFiles || [0]