2016-06-16 15 views
0

Ich möchte ein Firefox Add-on schreiben, das mit einem lokal installierten Programm kommuniziert, um Daten auszutauschen. Es sieht so aus, als könnte dies unter Verwendung von js-ctypes oder der Low-Level-API system/child_process erfolgen, wobei letztere die recommended solution ist.Wie kann ich eine Datei finden, die mit der system/child_process-API in einem Firefox-Add-On verwendet werden soll?

Das child_process-API appelliert, weil es Daten abstrakt über eine Pipe und nicht direkt auf der C-Schnittstellenebene sendet und empfängt. Es ist jedoch zu verwenden Sie müssen (wie es scheint) den vollständigen Pfad zu der ausführbaren Datei im Code zu liefern:

var child_process = require("sdk/system/child_process"); 
var ls = child_process.spawn('/bin/ls', ['-lh', '/usr']); 

In meinem Fall die ausführbare Datei von einer anderen Anwendung installiert ist, und wir wissen nicht, es die genaue Standort ist - Es unterscheidet sich je nach Betriebssystem, den Laufwerken des Benutzers und möglicherweise den Vorlieben des Benutzers. Ich kann mir vorstellen, dass dieses Problem bei den meisten ausführbaren Dateien auftritt, die nicht in das Betriebssystem integriert sind. Also meine Frage ist: was bedeutet, muss ich den vollständigen Pfad der ausführbaren Datei suchen, die ich verwenden möchte? Ich muss mehrere Betriebssysteme unterstützen, kann aber bei Bedarf unterschiedliche Lösungen für jeden verwenden.

Danke!

+2

Sie müssen erwartete Standorte iterieren. Viele gängige Adressen sind in "OS.Constants.Path" aufgeführt, wie Desktop usw. Sie können den Benutzer immer den Standort angeben lassen. Sie können Umweltinformationen erhalten - https://developer.mozilla.org/en-US/Add-ons/SDK/Low-Level_APIs/system_environment – Noitidart

+2

https://developer.mozilla.org/en-US/Add-ons/ SDK/Low-Level_APIs/io_file - zeigt Ihnen, wie Sie Dateien in einem Verzeichnis auflisten. child_process wird in js-ctypes selbst geschrieben. Nicht umschreiben es haha ​​ – Noitidart

+0

Nun, wie finden andere Anwendungen den genauen Standort? Liegt es in der 'PATH' oder einer anderen Umgebungsvariablen? Gibt es eine Konfigurationsdatei im Home-Verzeichnis des Benutzers? – the8472

Antwort

1

Hier ist der Code, den ich unter Windows verwendete - der Schlüssel war in der Lage, eine Umgebungsvariable zu lesen, um den Speicherort des entsprechenden Anwendungsordners zu finden. Danach nehme ich an, dass meine Anwendung unter einem bekannten Unterpfad gespeichert ist (wir erlauben keine Anpassung).

var system = require("sdk/system"); 
var iofile = require('sdk/io/file'); 
var child_process = require('sdk/system/child_process'); 

var progFilesFolder = system.env["programfiles(x86)"], 
    targetFile = iofile.join(progFilesFolder, 'FolderName', 'Program.exe'); 
    targetFileExists = iofile.exists(targetFile); 

if (targetFileExists) { 
    var p = child_process.spawn(targetFile); 
} 

Ich habe nicht den Code für Mac noch geschrieben, aber ich erwarte, dass es ähnlich, mit dem Unterschied, dass es sein zu befürchten und die Systemordner in OS X haben keine Laufwerksbuchstaben Standardnamen sind (auch auf lokalisierten Systemen).