如何获取便携式电子应用程序的原始路径?
How to get the original path of a portable Electron app?
我在 Windows 上有一个便携式 Electron 应用程序(包含:electron-builder + asar,便携式构建)。我尝试获取应用程序路径,但它 returns 是 user\temp 文件夹中的路径,而不是实际的“.exe”文件
有什么办法可以得到原来的app.exe路径吗?
我试过以下方法:
- app.getAppPath()
- __dirname
- require.main.filename
- 应用根路径
- 和一些节点模块
我从测试中得到的路径:
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'))
}
我在 Windows 上有一个便携式 Electron 应用程序(包含:electron-builder + asar,便携式构建)。我尝试获取应用程序路径,但它 returns 是 user\temp 文件夹中的路径,而不是实际的“.exe”文件
有什么办法可以得到原来的app.exe路径吗?
我试过以下方法:
- app.getAppPath()
- __dirname
- require.main.filename
- 应用根路径
- 和一些节点模块
我从测试中得到的路径:
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'))
}