从渲染器进程以递归方式调用fs.readdirSync
会冻结应用程序。
1.7.9
和macOS 10.12.6
上的最新电子Windows 10
会发生这种情况
STR:
使用包含许多文件的大型目录更改
dir
,所以 功能运行了一段时间
var fs = require('fs')
var path = require('path')
var dir = '/Users'
var totalFiles = [0]
var filesArray = []
var sizesArray = []
function getFilesRecursively(dir, totalFiles, filesArray, sizesArray){
try { var files = fs.readdirSync(dir); }
catch(err) { } // 'fs.readdirSync(dir) -', console.warn(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, filesArray, sizesArray)
// filtering out symlinks, sockets etc
else if (stats.isFile()) {
// we can't use regular counter, since incrementing a primitive value doesn't change the value back in the caller function's scope.
// https://stackoverflow.com/a/48378462/4537590
totalFiles[0]++
// filtering out 0 size files
if (stats.size > 0) {
sizesArray.push(stats.size)
filesArray.push(name)
}
}
} catch(err) { } // console.warn('fs.lstatSync(name) -', err.message) }
}
console.log(filesArray.length) // console logging to see function progress
return { "files" : filesArray, "sizes" : sizesArray, "total_files" : totalFiles }
}
///////////////////////////////////////////
getFilesRecursively(dir, totalFiles, filesArray, sizesArray)
我已在Electron API Demos应用中对此进行了测试,并使用了"electron": "~1.6.2"
它也冻结了。
请帮助
答案 0 :(得分:1)
由于这是回答你问题的回复,我改写了我的评论:
正如文档中所解释的那样,fs.readdirSync
是一个同步操作,它正常处理并在处理时阻止应用程序的其余部分。
如果你想避免这种情况,你将不得不使用异步方法fs.readdir
,在准备就绪时调用回调,或者用蓝鸟“保证”它或将其包装成一个承诺。