在node-webkit中使用默认程序打开一个文件

时间:2015-04-27 17:32:09

标签: javascript linux windows node.js node-webkit

我想为用户提供他想要编辑文件的任何选项,如何使用特定文件类型的默认程序打开文件?我需要它与Windows和Linux一起使用,但Mac选项也很棒。

6 个答案:

答案 0 :(得分:11)

正如PSkocik所说,首先检测平台并获取命令行:

function getCommandLine() {
   switch (process.platform) { 
      case 'darwin' : return 'open';
      case 'win32' : return 'start';
      case 'win64' : return 'start';
      default : return 'xdg-open';
   }
}

第二步,执行命令行,然后执行路径

var sys = require('sys');
var exec = require('child_process').exec;

exec(getCommandLine() + ' ' + filePath);

答案 1 :(得分:5)

对于磁盘上的文件:

var nwGui = require('nw.gui');
nwGui.Shell.openItem("/path/to/my/file");

对于远程文件(例如网页):

var nwGui = require('nw.gui');
nwGui.Shell.openExternal("http://google.com/");

答案 2 :(得分:3)

您可以使用open模块:

await client.RespondAsync<ISimpleResponse>(new { Data="test response"});

,然后在您的Node.js文件中调用它:

npm install --save open

该模块已经包含用于检测操作系统的逻辑,并且它运行与您的系统与此文件类型相关联的默认程序。

答案 3 :(得分:2)

检测平台并使用:

  • 在Windows上启动'
  • 在Mac上打开'
  • 在Linux上
  • 'xdg-open'

答案 4 :(得分:0)

我不确定开始是否曾在早期的Windows版本上工作,但是在Windows 10上,它不能像答案中所示那样工作。它的第一个参数是窗口的标题。

此外,Windows和Linux之间的行为是不同的。 Windows“start”将执行并退出,在linux下,xdg-open将等待。

这个功能最终在两个平台上以类似的方式为我工作:

  function getCommandLine() {
     switch(process.platform) {
       case 'darwin' :
         return 'open';
       default:
         return 'xdg-open';
     }
  }

  function openFileWithDefaultApp(file) {
       /^win/.test(process.platform) ? 
           require("child_process").exec('start "" "' + file + '"') :
           require("child_process").spawn(getCommandLine(), [file],
                {detached: true, stdio: 'ignore'}).unref(); 
  }

答案 5 :(得分:0)

如果您打算使用默认编辑器编写某种提示脚本或简单地打开链接文件,则必须等到程序结束或失败。

灵感来自 PSkocikKhalid 的答案。

const {exec} = require('child_process');

let openFile=function(filePath,mute){

    let command=(function() {
        switch (process.platform) { 
            case 'darwin' : return 'open '+filePath+' && lsof -p $! +r 1 &>/dev/null';
            case 'win32' : 
            case 'win64' : return 'start /wait '+filePath;
            default : return 'xdg-open '+filePath+' && tail --pid=$! -f /dev/null';
        }
    })();

    
    if(!mute)console.log(command);
    let child=exec(command);
    if(!mute)child.stdout.pipe(process.stdout);
    
    return new function(){
        this.on=function(type,callback){
            if(type==='data')child.stdout.on('data',callback);
            else if(type==='error')child.stderr.on('data',callback);
            else child.on('exit',callback);
            return this;
        };
        this.toPromise=function(){
            return new Promise((then,fail)=>{
                let out=[];
                this.on('data',d=>out.push(d))
                .on('error',err=>fail(err))
                .on('exit',()=>then(out));
            });
        };
    }();
};

使用:

openFile('path/to/some_text.txt')
.on('data',data=>{
    console.log('output :'+data);
})
.on('error',err=>{
    console.log('error :'+err);
})
.on('exit',()=>{
    console.log('done');
});

或:

openFile('path/to/some_text.txt').toPromise()
.then(output=>{
    console.log('done output :'+output.join('\n'));
}).catch(err=>{
    console.log('error :'+err);
});

PS:让我知道它是否等待 winXX 以外的其他系统(灵感来自 Rauno Palosaari post 但尚未测试)。