[置顶] nw.js node-webkit系列(22).nw执行过程及如何获取.nw真实路径

时间:2022-06-18 05:46:58

本章节将以实际应用为例子,介绍.nw应用的执行过程及如何获取.nw应用的相关路径,如何获取其关联子.nw应用的绝对路径。

.nw应用的执行过程

现在以博主所用运行环境为例:电脑系统:win8.1;nw版本:0.12;测试应用:app.nw。

当我们把.nw应用拖进nw.exe或者将两者打包成一个app.exe执行的时候,我们的应用文件是怎么执行打开的呢?

按上述操作运行app.nw时,nw.exe做了3步操作:

1)将app.nw以zip解压的方式将其解压至用户的本机应用程序数据临时目录,其中会随机生成一个nw开头的放置目录,C:\Users\netinnet\AppData\Local\Temp\nw4128_20570

2)解析nw4128_20570目录下的package.json

3)执行nw4128_20570目录下的index.html(即应用的启动页)

(注)nw4128_20570目录下文件便是你app.nw压缩前的文件。

(注)当应用退出时,该目录会随着应用退出而被删除。


如何获得.nw应用的相关路径

当我们需要.nw应用写入数据或者读取数据时,获取.nw应用相关路径的操作必不可少。

var path = require("path");
//根目录,如app://movie_desktop
var rootArray = window.document.location.href.split("/");
var rootPath = rootArray[0] + "//" + rootArray[2];
//数据存储地址
var dataPath = require('nw.gui').App.dataPath;
//nw.exe运行地址
var execPath = path.dirname(process.execPath);
//应用地址
var cwdPath = process.cwd();

如何获取其关联子.nw应用的绝对路径

打个比方,我们现在在开发一款HTML5动画播放器,播放器应用为play.nw,然后我们有自定义的影片数据格式.yoya,如movie.yoya(也是nw应用,为movie.nw改后缀名而成),那么我们如何来实现双击子应用movie.yoya来触发打开父应用play.nw播放器并将传参自身绝对路径传值至播放器呢?

(注)播放器只有拿到影片的绝对地址后,就可按照上述".nw应用的执行过程"的原理解压并执行影片应用。

这里我们分为两个问题来分析:

1.如何实现双击子应用movie.yoya来触发打开父应用play.nw播放器。

2.如何将子应用movie.yoya的绝对路径传值至父应用play.nw播放器。

例如,我们的应用操作目录如下:

[置顶]        nw.js node-webkit系列(22).nw执行过程及如何获取.nw真实路径

如果你的应用已经将play.nw和nw.exe打包在一起,可将yoya.exe视为两者打包后的exe应用;

如果你并没有将play.nw和nw.exe打包在一起而是分开放置,想要通过执行一个exe就可实现打开你的应用,需要一个批处理命令.bat,批处理命令的脚本如下:

"%~dp0nw.exe" "%~dp0play.nw" "%1"
其中"%~dp0nw.exe"代表获取相对目录下的 nw.exe执行程序,"%~dp0play.nw"代表获取相对目录下的play.nw应用,"%1"执行时将要传进的参数(后边将介绍如何使用"%1")
然后我将该.bat通过一个bat转exe小工具BatToExeConverter_gr实现转换,即可得到yoya.exe,此时我双击yoya.exe是同样可以实现启动应用的效果。

此时我们只要修改注册表,在注册表中添加双击.yoya文件指向使用yoya.exe打开,实现双击子应用即可打开父应用的效果。修改后的指向类似于下图:

[置顶]        nw.js node-webkit系列(22).nw执行过程及如何获取.nw真实路径

[置顶]        nw.js node-webkit系列(22).nw执行过程及如何获取.nw真实路径

(注)如何安装软件时设置注册表,这里就不做介绍了,百度一下即可找到方法,或者参考我之前的一篇文章"Inno Setup 实现自定义文件类型的安装脚本"进行了解,当然也可以使用NSIS。

此时,注册表中的%1与由批处理命令打包的yoya.exe中的%1起作用了,%1的意思就是被打开.yoya文件的绝对路径,而整个运行过程就是:

首先,是双击.yoya文件,注册表就会根据.yoya文件在注册表中的打开规则,即C:\Users\netinnet\AppData\Local\YoyaPlay\yoya.exe "%1",将.yoya文件的路径传值至C:\Users\netinnet\AppData\Local\YoyaPlay\yoya.exe应用并打开该应用。

然后,当yoya.exe打开时,即执行命令行脚本"%~dp0nw.exe" "%~dp0play.nw" "%1",使用相对目录下的nw.exe来运行播放器play.nw,并将上一步传来的.yoya文件绝对路径(即%1)传值至播放器play.nw。

最后,paly.nw只要使用nw提供的API去接收该参数即可获取.yoya文件的绝对路径。

接收方法如下:

var getAppArgs = function() {
var args = gui.App.argv; //这个为一个数组,当遇到空格符号时将断开至数组下一个值
var result = "";
if (args.length != 0) {
for (var i = 0; i < args.length; i++) {
result += args[i] + " ";
}
}
result = result.substr(0, result.length - 1); //去掉最后一个空格符
return result;
};

这时,获取影片文件路径后的你,即可使用nw提供的Window.open等相关方法,来打开新窗口并播放你的影片。

(注)通过nw的API获取到的参数是一个数组,当绝对路径包含空格情况时,将会被拆分到数组里,如C:\Program Files (x86)将会在数组中存储为2个值,一个是C:\Program,另一个是Files (x86)。如果不想拆分,而是直接返回一个完整的本地绝对地址,使用下面批处理命令脚本语句:

"%~dp0nw.exe" "%~dp0play.nw" %1
你会发现,与上文中批处理脚本的区别在于其中最后一个参数%1不再用双引号,这时通过nw的API获取到的参数同样是数组,但只有一个项,为影片文件的本地绝对路径。