如何获取便携式电子应用程序的原始路径?

How to get the original path of a portable Electron app?

我在 Windows 上有一个便携式 Electron 应用程序(包含:electron-builder + asar,便携式构建)。我尝试获取应用程序路径,但它 returns 是 user\temp 文件夹中的路径,而不是实际的“.exe”文件

有什么办法可以得到原来的app.exe路径吗?

我试过以下方法:

我从测试中得到的路径:

C:\Users\xxx\AppData\Local\Temp\xxxxxx.tmp\app

实际的 .exe 路径(应用程序从哪里启动,以及我需要什么):

C:\Users\XXX\Documents\test\dist

我刚开始使用 Electron。

来自主进程:[​​=12=]

// 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);

我找到了解决办法: 使用环境变量(由 Electron-Builder 创建)

process.env.PORTABLE_EXECUTABLE_DIR

显示 App.exe 的真实路径。 仅适用于 Electron-Builder

None 以上答案对我有用Windows 10。

process.env.PORTABLE_EXECUTABLE_DIR returns Temp 目录路径。

我使用它来工作:

process.env.INIT_CWD
process.env.PORTABLE_EXECUTABLE_FILE

将为您提供文件的完整路径。

由于上述 none 方法有效,我不想为此使用外部库,我尝试了以下方法:

        if (!fs.existsSync("../images")) {
            fs.mkdirSync("./../images");            
        }
        return path.resolve("./../images/") + "/";

您可以使用应位于顶层或其他任何位置的任何目录。在我的例子中,我知道目录中的上一层必须有一个名为 "images".

的目录

此解决方案适用于我的 DEV 构建和产品(打包)。

使用这种方法有什么缺点吗?

我遇到了很多麻烦,最终通过将 __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'))
}