fs.readdirSync冻结电子应用程序

时间:2018-01-23 08:24:54

标签: node.js electron

从渲染器进程以递归方式调用fs.readdirSync会冻结应用程序。

1.7.9macOS 10.12.6上的最新电子Windows 10会发生这种情况

STR:

  • 从devtools运行以下功能并尝试通过电子申请点击
  

使用包含许多文件的大型目录更改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"它也冻结了。

请帮助

1 个答案:

答案 0 :(得分:1)

由于这是回答你问题的回复,我改写了我的评论:

正如文档中所解释的那样,fs.readdirSync是一个同步操作,它正常处理并在处理时阻止应用程序的其余部分。

如果你想避免这种情况,你将不得不使用异步方法fs.readdir,在准备就绪时调用回调,或者用蓝鸟“保证”它或将其包装成一个承诺。