Электронное приложение 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 в notFoundRas_RAR: notFoundSr. в 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) в / Пользователи / nicholasstephan / Рабочий стол / XXXXXXXX / dist / Mac / XXXXXXXX.app / Содержание / Ресурсы /app.asar/media.js:52:4 ...

где media.jsВ 19 упоминается, что const file = fs.createWriteStream(${Реж}/${имя}); строка в коде.

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

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

Благодарю.

1 ответ

Решение

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

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

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

Другие вопросы по тегам