电子app createWriteStream抛出ENOENT错误

时间:2017-02-27 20:00:38

标签: node.js electron fs enoent

我正在尝试将文件下载到电子应用中的文件系统中。我的代码在主线程中看起来像这样:

const dir = `${__dirname}/media`;
if (!fs.existsSync(dir)){
    fs.mkdirSync(dir);
}

const file = fs.createWriteStream(`${dir}/${name}`);
file.on("open", function() {
    const request = http.get(url, function(response) {
        response.pipe(file);

        response.on('end', function() {
            file.close();
            ...
        });
    });

    request.on('error', function(err) {
        ...
    });
});

使用electron .在开发中运行时,这是有效的但是在使用electron-builder构建它之后,我在警告中收到错误:

  

未捕获的例外情况:   错误:在/Users/nicholasstephan/Desktop/XXXXXXX/dist/Mac/XXXXXX.app/Contents/Resources/app.asar中找不到ENOENT,media / uploads_2016_02_BASF_Holistic_Program.jpg       在notFoundError(ELECTRON_ASAR.js:109:19)       at Object.module。(匿名函数)[as open](ELECTRON_ASAR.js:209:16)       在WriteStream.open(fs.js:1890:6)       在新的WriteStream(fs.js:1876:10)       at Object.fs.createWriteStream(fs.js:1831:10)       在下一个(/Users/nicholasstephan/Desktop/XXXXXXXX/dist/Mac/XXXXXXXX.app/Contents/Resources/app.asar/media.js:19:18)       at /Users/nicholasstephan/Desktop/XXXXXXXX/dist/Mac/XXXXXXXX.app/Contents/Resources/app.asar/media.js:52:4   ...

其中引用的media.js,ln 19是代码中的const file = fs.createWriteStream( $ {dir} / $ {name} );行。

我已经尝试了大约十几个其他类似的stackoverflow答案中提供的解决方案,但没有一个能解决问题。

这里发生了什么?

感谢。

1 个答案:

答案 0 :(得分:2)

内置的Electron应用使用Asar格式。 Asar是一种存档格式(它实际上只是一个大文件)虽然在Electron中你可以从中读取它就好像它是一个标准目录。

我认为(虽然我没有看到它明确记录),不可能使用fs函数写入Asar。在任何情况下,几乎可以肯定更适合写入数据的位置。

尝试写入不同的路径。 Electron使用app.getPath(name)提供了许多有用的路径,因此您可以例如写入保存应用程序配置文件的userData目录。