使用 Electron 开发桌面应用的时候,通常我们会使用 app.getPath() 来获取一些常见的文件夹路径,比如下载目录。

但是我们偶尔会接到一些反馈,说我们无法正确获取到下载目录,也是就是 app.getPath('downloads') 出错,会返回一个错误信息

Failed to get 'download' path

一直以来我们也只是接到反馈,没有能够明白为什么会出错,直到昨天我在某个机器上碰到了有人修改了下载目录的路径,然后对应的磁盘移除之后,Electron 又抛出了这个错误, 我才意识到这个错误的根本原因。

猜测应该是 Electron 读取注册表内下载目录路径之后,会对这个文件夹做一下检查,然后因为这个路径已经不可读写,所以就抛出了错误。目前 Electron 开发团队对相关 bug 并没有做直接回应,也没计划修复,因此我们只能自己在应用内做一下保护。

getDownloadPath(): string {
  try {
    return app.getPath('downloads')
  } catch (error) {
    console.error('Failed to get \'download\' path', error)
    const userInfo = os.userInfo()
    return path.join(
      userInfo.homedir,
      'Downloads'
    )
  }
}

相关 issue: