Как получить оригинальный путь портативного приложения Electron?
У меня есть портативное электронное приложение (упаковано: электрон-строитель + асар, портативная сборка) на Windows. Я пытаюсь получить путь к приложению, но он возвращает путь в папке user \ temp, а не фактический файл.exe
Есть ли способ получить оригинальный путь app.exe?
Я пробовал следующее:
- app.getAppPath ()
- __dirname
- require.main.filename
- Приложение-корневой путь
- и несколько узловых модулей
Путь, который я получаю из моих тестов:
C: \ Users \ ххх \AppData\Local\Temp\xxxxxx.tmp\ приложение
фактический путь.exe (откуда приложение запущено и что мне нужно):
C: \ Users \ XXX \ Documents \ тест \ расстояние
Я только начинаю с Электрон.
3 ответа
Я нашел решение: использовать переменную среды (созданную Electron-Builder)
process.env.PORTABLE_EXECUTABLE_DIR
чтобы показать реальный путь к App.exe. Работает только с Electron-Builder
Из основного процесса:
// If not already defined...
const { app } = require ('electron');
const path = require ('path');
let execPath;
execPath = path.dirname (app.getPath ('exe'));
// or
execPath = path.dirname (process.execPath);
Из процесса рендеринга:
// If not already defined...
const { remote } = require ('electron');
const path = require ('path');
let execPath;
execPath = path.dirname (remote.app.getPath ('exe'));
// or
execPath = path.dirname (remote.process.execPath);
У меня было много проблем с этим, и я наконец смог решить проблему, заменив __dirname на '.', См. Рабочий пример ниже:
const path = require('path')
const myAppPath = path.resolve('.', 'myapp.exe');
Похоже на PORTABLE_EXECUTABLE_FILE
работает только в определенных конфигурациях Electron-Builder; В частности, он не будет работать в приложениях, развернутых как переносной каталог.
В таких случаях корневой путь приложения будет следующим:
const path = require('path')
import { app } from 'electron'
let rootDir = app.getAppPath()
let last = path.basename(rootDir)
if (last == 'app.asar') {
rootDir = Path.dirname(app.getPath('exe'))
}
Ни один из приведенных выше ответов не работал для меня в Windows 10.
process.env.PORTABLE_EXECUTABLE_DIR
возвращает путь к папке Temp.
Я получил его на работу с помощью:
process.env.INIT_CWD
process.env.PORTABLE_EXECUTABLE_FILE
даст вам полный путь к файлу.
Поскольку ни один из вышеперечисленных методов не работал, и я не хочу использовать для этого внешнюю библиотеку, я попытался сделать следующее:
if (!fs.existsSync("../images")) {
fs.mkdirSync("./../images");
}
return path.resolve("./../images/") + "/";
Вы можете использовать любой каталог, который должен существовать на верхнем уровне или где-либо еще. В моем случае я знаю, что на один уровень выше в каталоге должен быть каталог с именем "images".
Это решение работало в моем случае для сборки и разработки DEV (упаковано).
Есть ли недостатки при использовании этого подхода?