Как получить оригинальный путь портативного приложения 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 (упаковано).

Есть ли недостатки при использовании этого подхода?

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