Подтвердить что ты не робот

Открыть внешний файл с помощью Electron

У меня есть работающее приложение Electron и до сих пор отлично работает. Для контекста мне нужно запустить/открыть внешний файл, который представляет собой двоичный файл Go-lang, который будет выполнять некоторые фоновые задачи. В основном это будет выступать в качестве бэкэнд и подвергать API, который будет использовать приложение Electron.

До сих пор это то, что я получаю:

  • Я попытался открыть файл с помощью "node way" с помощью child_process, но я не смог открыть файл примера txt, вероятно, из-за пути вопросы.

  • Электронный API раскрывает open-file, но в нем отсутствует документация/пример, и я не знаю, может ли это быть полезным.

Что это. Как открыть внешний файл в Electron?

4b9b3361

Ответ 1

Есть пара API, на которых вы, возможно, захотите учиться и посмотреть, что вам поможет.

фс

Модуль 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');

ракушка

API shell - это API-интерфейс только для электронов, который можно использовать для запуска файла по заданному пути, который будет использовать приложение по умолчанию для открытия файла.

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 не является исполняемым файлом, то вам нужно будет сделать нативную оболочку аддона.

Ответ 2

Электрон разрешает использование пакетов nodejs.

Другими словами, импортируйте пакеты node, как если бы вы были в node, например:

var fs = require('fs');

Чтобы запустить двоичный файл golang, вы можете использовать модуль child_process. Документация завершена.

Изменить. Вы должны решить различия путей. Событие open-file - это событие на стороне клиента, вызванное окном. Не то, что вы хотите здесь.

Ответ 3

Я знаю, что это точно не соответствует вашей спецификации, но оно чисто отделяет ваше бинарное приложение golang и электронное приложение.

То, как я это сделал, состоит в том, чтобы выставить двоичный файл golang как веб-службу. Как этот

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 просто сделайте ajax-вызовы веб-службе с помощью функции javascript. Подобно этому (вы можете использовать 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);
  }