1

我正在尝试将文件下载到电子应用程序中的文件系统。我的代码,在主线程中,如下所示:

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,我在警报中收到错误:

未捕获的异常:错误:ENOENT, media/uploads_2016_02_BASF_Holistic_Program.jpg 在 /Users/nicholasstephan/Desktop/XXXXXXX/dist/Mac/XXXXXX.app/Contents/Resources/app.asar 中未找到 notFoundError (ELECTRON_ASAR.js:109:19)在 Object.module.(匿名函数) [as open] (ELECTRON_ASAR.js:209:16) 在 WriteStream.open (fs.js:1890:6) 在新的 WriteStream (fs.js:1876:10) 在 Object. fs.createWriteStream (fs.js:1831:10) 在下一个 (/Users/nicholasstephan/Desktop/XXXXXXXX/dist/Mac/XXXXXXXX.app/Contents/Resources/app.asar/media.js:19:18) 在 /用户/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 答案中提供的解决方案,但没有一个解决了这个问题。

这里发生了什么?

谢谢。

4

1 回答 1

2

构建的 Electron 应用程序使用Asar格式。Asar 是一种存档格式(它实际上只是一个大文件),但在 Electron 中,您可以像读取标准目录一样读取它。

我认为(尽管我没有看到它明确记录)不可能用这些fs函数写入 Asar。无论如何,几乎可以肯定有更合适的位置来写入数据。

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

于 2017-02-28T12:22:56.957 回答