38

実行中の Electron アプリがあり、これまでのところうまく機能しています。コンテキストについては、いくつかのバックグラウンド タスクを実行する Go-lang バイナリである外部ファイルを実行/開く必要があります。基本的に、これはバックエンドとして機能し、Electron アプリが使用する API を公開します。

これまでのところ、これは私が入っているものです:

  • child_processを使用して「ノード ウェイ」でファイルを開こうとしましたが、おそらくパスの問題が原因で、サンプルの txt ファイルを開くことができませんでした。

  • Electron API はファイルを開くイベントを公開しますが、ドキュメントや例がなく、役立つかどうかわかりません。

それでおしまい。Electron で外部ファイルを開くにはどうすればよいですか?

4

5 に答える 5

72

調べて、どれが役立つかを確認したいAPIがいくつかあります。

fs

このfsモジュールを使用すると、直接読み書きするためにファイルを開くことができます。

var fs = require('fs');
fs.readFile(p, 'utf8', function (err, data) {
  if (err) return console.log(err);
  // data is the contents of the text file we just read
});

このpathモジュールを使用すると、プラットフォームに依存しない方法でパスを構築および解析できます。

var path = require('path');
var p = path.join(__dirname, '..', 'game.config');

シェル

このshellAPI は、指定されたパスでファイルをシェル実行するために使用できる電子専用 API であり、OS のデフォルト アプリケーションを使用してファイルを開きます。

const {shell} = require('electron');
// Open a local file in the default app
shell.openItem('c:\\example.txt');

// Open a URL in the default way
shell.openExternal('https://github.com');

child_process

golang バイナリが実行可能ファイルであると仮定すると、それchild_process.spawnを呼び出して通信するために使用します。これはノード API です。

var path = require('path');
var spawn = require('child_process').spawn;

var child = spawn(path.join(__dirname, '..', 'mygoap.exe'), ['game.config', '--debug']);
// attach events, etc.

アドオン

golang バイナリが実行可能でない場合は、ネイティブ アドオンラッパーを作成する必要があります。

于 2015-10-29T22:18:41.053 に答える
-1

これがあなたの仕様を正確に満たしていないことはわかっていますが、golang バイナリと Electron アプリケーションを明確に分離しています。

私が行った方法は、golang バイナリを Web サービスとして公開することです。このような

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    //TODO: put your call here instead of the Fprintf
    fmt.Fprintf(w, "HI there from Go Web Svc. %s", r.URL.Path[1:])
}

func main() {
    http.HandleFunc("/api/someMethod", handler)
    http.ListenAndServe(":8080", nil)
}

次に、Electron から、javascript 関数を使用して Web サービスへの ajax 呼び出しを行うだけです。このように(jQueryを使用できますが、この純粋なjsがうまく機能することがわかりました)

function get(url, responseType) {
    return new Promise(function(resolve, reject) {
      var request = new XMLHttpRequest();
      request.open('GET', url);
      request.responseType = responseType;

    request.onload = function() {
    if (request.status == 200) {
      resolve(request.response);
    } else {
      reject(Error(request.statusText));
    }
  };

  request.onerror = function() {
    reject(Error("Network Error"));
  };

  request.send();
});

その方法では、次のようなことができます

get('localhost/api/somemethod', 'text')
  .then(function(x){
    console.log(x);
  }
于 2015-05-22T03:19:45.780 に答える