我有一个包含 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 }
}
我计划在包含数十万个文件的大型目录上运行脚本,并希望使用计数器增量,这比推送到数组更快。
请帮忙。
最佳答案
两个原因
- 您没有将递归的返回值添加到最终值中。
- 增加原始值不会将该值更改回调用方函数的作用域中。
成功
if (stats.isDirectory())
{
var returnVal = getFilesRecursively(name, totalFiles, totalFilesArray);
totalFiles += returnVal.total_files;
}
此外,在方法开头将 totalFiles
值设置为 0。
关于javascript - 文件数量计数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48378411/