【问题标题】:JS: electron use fs.readSync in render processJS:电子在渲染过程中使用 fs.readSync
【发布时间】:2019-05-28 22:58:13
【问题描述】:

在渲染过程中使用fs.readSync(),缓冲区的元素总是0。 使用fs.read() 会得到正确的结果。

const electron = window.require('electron');
const { remote } = electron;
const fs = remote.require('fs');

const fd = fs.openSync(localPath, 'r');
const fileStat = fs.fstatSync(fd);

const { size: fileSize } = fileStat;
const dataBuffer = Buffer.alloc(fileSize);
const readSize = 1024;
for(let i = 0; i < fileSize; i += readSize) {
  fs.readSync(fd, dataBuffer, i, Math.min(fileSize - i, readSize), null);
  console.log(dataBuffer);
}

【问题讨论】:

  • 对于fs,您不需要通过电子遥控器(因为它是默认的nodejs模块)。简单写const fs = require('fs')。我不知道为什么它不能以另一种方式工作。
  • 如果在渲染过程中直接使用const fs = require('fs'),会抛出错误fs.openSync is not a function。可能是因为数组是通过远程复制的?有没有办法加载大文件?

标签: javascript electron fs


【解决方案1】:

返回0可能意味着同步操作失败remote。您可能会在主线程中捕获异常。

顺便说一句:在 nodejs 中同步函数调用会很慢。这就是为什么所有这些函数都以Sync 作为后缀命名的原因。如果可能的话,我强烈建议您在任何地方编写异步代码。

【讨论】:

  • 可能是因为数组是通过远程复制的?无论如何要加载一个大文件吗?从主进程传输数据到渲染进程太慢了。
  • 我不完全知道您为什么要将大型本地文件加载到浏览器窗口中(渲染过程)。以下是一些想法:(1)您可以使用本机 html5 文件 api 像浏览器中的任何文件上传器一样加载文件(2)您可以在主进程和渲染进程之间注册自己的安全协议(例如 github.com/stanleyxu2005/electron-utils/blob/master/lib/…)然后您可以以最快的速度加载内容
  • 仅供参考,使用remoteTransfer data from main process to render process 没有什么不同。如果您在进程之间使用 ipc 时注意到没有远程的性能有些慢,那么使用远程只会使速度变慢(因为它是同步 ipc 底层)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 2018-05-20
  • 2017-07-24
  • 2020-09-05
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
相关资源
最近更新 更多