Как я могу загрузить файл в папку приложения? [после упаковки]

Это моя текущая структура папок перед упаковкой WRM_80.. моя загруженная папка.

У меня есть эти две строки кода внутри index.js для загрузки и отображения html в моем электронном окне.

fs.createReadStream('./Report.zip').pipe(unzip.Extract({ path: './'+folderName }));
LoginWindow.loadURL(`file://${__dirname}./`+folderName+`/t01s01q01.html`);

в режиме разработки он работает нормально, файл загружается в ту же папку, где находится мой index.js. Но после упаковки файл приложения загружается из папки приложения. Структура упакованных папок приведена ниже. WRM_80.. моя загруженная папка. после упаковки

Вот почему я не могу загрузить этот загруженный файл в окно. Как я могу загрузить файл в папку приложения? Если это невозможно, как я могу загрузить внешний файл из ресурсов\приложения?


person Habibul Hasan    schedule 03.07.2017    source источник
comment
разницы в картинках не вижу   -  person Zeokav    schedule 03.07.2017
comment
@Zeokav, пожалуйста, посмотри сейчас   -  person Habibul Hasan    schedule 03.07.2017


Ответы (1)


Ссылаясь на каталог как ./folder_name, вы, по сути, указываете приложению загружать его в рабочий каталог. В этом случае рабочим каталогом является папка, в которой содержится программа. При разработке и использовании команды electron рабочим каталогом является корень вашего приложения. Однако после установки и запуска как .exe рабочий каталог меняется на местоположение исполняемого файла.

Чтобы решить эту проблему, не используйте текущий рабочий каталог. Вместо этого используйте папку данных пользователя/приложения для хранения этой информации. Это не только единообразное место для разработки и развертывания, но и семантически правильное место для хранения данных приложения.

В Electron вы можете получить путь к папке данных приложения для вашего приложения с помощью:

const {app} = require('electron');
app.getPath('userData')

Итак, ваш код должен выглядеть примерно так:

var userData = app.getPath('userData');
fs.createReadStream(`${userData}/Report.zip`).pipe(unzip.Extract({ path: `${userData}/${folderName}` }));
LoginWindow.loadURL(`file://${userData}/${folderName}/t01s01q01.html`);
person AlienHoboken    schedule 05.07.2017
comment
Спасибо большое. Это решило мою проблему. Я также пытался решить это другим способом, и он также работает нормально. fs.createReadStream(path.resolve(${__dirname},Report.zip)).pipe(unzip.Extract({path: path.resolve(${__dirname},folderName)})); LoginWindow.loadURL(path.resolve(${__dirname},folderName,'t01s01q01.html')); - person Habibul Hasan; 07.07.2017
comment
Правильно, вы можете использовать path.resolve, чтобы заставить его работать, но лучше всего использовать папку с данными пользователя. Он дает надежную информацию о дополнительных данных, загружаемых/используемых вашим приложением, помимо основного приложения, которое находится в месте установки. - person AlienHoboken; 08.07.2017
comment
Еще раз спасибо :) это поможет. Я столкнулся с другой проблемой после создания установщика win, он поставляется с вирусом Trojan gen 2 в папке модуля узла. я должен сделать установщик и передать его клиенту, я в кошмаре, брат, как я могу держаться подальше от трояна gen 2 из файлов установщика? - person Habibul Hasan; 08.07.2017
comment
Проверьте, о каком файле сообщается, и убедитесь, что это законный модуль узла. В противном случае это может быть ложным срабатыванием, поэтому сообщите об этом в компанию, которая использовала антивирус для его обнаружения. - person AlienHoboken; 10.07.2017
comment
stackoverflow.com/questions/45004014/ Это файл, для которого я получаю троян второго поколения - person Habibul Hasan; 11.07.2017