Приложение Electron createWriteStream выдает ошибку 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 я получаю сообщение об ошибке в предупреждении:

Неперехваченное исключение: ошибка: ENOENT, media / uploads_2016_02_BASF_Holistic_Program.jpg не найден в /Users/nicholasstephan/Desktop/XXXXXXX/dist/Mac/XXXXXX.app/Contents/Resources/app.asar 109: ELECTRONIC в notFoundEs в Object.module. (анонимная функция) [как открытая] (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) в / Users / nicholasstephan / Desktop / XXXXXXXX / dist / Mac / XXXXXXXX.app / Contents / Resources / app.asar / media.js: 52: 4 ...

где media.js, ln 19, относится к строке _5 _ $ {dir} / $ {name} ); в коде.

Я пробовал решения, предлагаемые примерно в десятке других похожих ответов на stackoverflow, но ни один из них не устранил проблему.

Что тут происходит?

Спасибо.


person nicholas    schedule 27.02.2017    source источник


Ответы (1)


Созданное приложение Electron использует формат Asar. Asar - это формат архива (на самом деле это всего лишь один большой файл), хотя в Electron вы можете читать из него, как если бы это был стандартный каталог.

Я предполагаю (хотя я не видел, чтобы это было явно задокументировано), что невозможно писать в Asar с помощью функций fs. В любом случае почти наверняка есть более подходящие места для записи данных.

Попробуйте написать по другому пути. Electron предоставляет ряд полезных путей, используя app.getPath(name), чтобы вы могли, например, написать в каталог userData, в котором хранятся файлы конфигурации для вашего приложения.

person Justin Emery    schedule 28.02.2017