2014-05-01 82 views
1

我試圖訪問Firefox插件中的命名管道。我的代碼的基礎上,解決2至this CodeProject上的問題,就是:如何使用Firefox插件中的JavaScript訪問命名管道?

var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); 
file.initWithPath("\\\\.\\pipe\\test"); 
var text = "Some text to be written"; 
var writer = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); 
// Open file for read/write access, and create it if it does not exist. 
writer.init (file, 0x04 | 0x08, -1, 0); 
writer.write (text, text.length); 
writer.flush(); 
writer.close(); 

當我運行,這是Firefox的便籤,我得到:

/* 
Exception: Component returned failure code: 0x80520012 (NS_ERROR_FILE_NOT_FOUND) [nsIFileOutputStream.init] 
@6 
*/ 

6號線是我叫writer.init行。

我已經玩過將不同的標誌傳遞給writer.init,但沒有運氣。我可以使用此代碼寫入正常的文件路徑,而不是命名的管道路徑。

我一直在尋找大部分時間的更多信息。我發現的唯一其他相關的事情是this Bugzilla提到同樣問題的bug,但它的日期爲2009年。

非常感謝您的任何建議。

編輯:基於答覆我嘗試了以下內容:

var encoder = new TextEncoder(); 
var array = encoder.encode("This is some text"); 
var path = "\\\\.\\pipe\\test"; 
Task.spawn(function() { 
    let pfh = yield OS.File.open(path, {write: true}); 
    yield pfh.write(array); 
    yield pfh.close(); 
}); 

這讓我寫一個文件(如果我相應地更改路徑),但似乎沒有送什麼東西給管。

這裏是我用來閱讀在.NET側的配管(公認原油)代碼:

let server = new NamedPipeServerStream ("\\\\.\\pipe\\test", PipeDirection.InOut) 
let reader = new StreamReader (server) 
do 
    printfn "Listening..." 
    server.WaitForConnection() 
    printfn "Connected." 
while true do 
    while reader.EndOfStream = false do reader.ReadLine() |> printfn "%s" 

我扔在一起,以驗證我至少可以寫入管道的代碼在.NET:

let client = new NamedPipeClientStream ("\\\\.\\pipe\\test") 
do client.Connect() 
let writer = new StreamWriter (client) 
do writer.AutoFlush <- true 

// Wait for connection 
System.Threading.Thread.Sleep (1000) 
let message = "hello" 
do message |> writer.WriteLine 
+0

一些實驗後,我能夠從管道讀取,但寫入失敗。我會繼續嘗試。在一邊(.net)注意,'NamedPipeClientStream'構造函數將管道名稱作爲參數,而不是完整路徑。 – paa

+0

你還有這個需求嗎?我現在有很多'ctypes'的經驗,這個東西很容易在'js-ctypes'中完成。 – Noitidart

回答

-1

嘗試OS.File:

let encoder = new TextEncoder();         // This encoder can be reused for several writes 
let array = encoder.encode("This is some text");     // Convert the text to an array 
let promise = OS.File.writeAtomic("\\\\.\\pipe\\test", array,    // Write the array atomically to "file.txt", using as temporary 
    {tmpPath: "file.txt.tmp"});         // buffer "file.txt.tmp". 
+0

謝謝你的回覆Noitidart。我試過了,它不會給我任何錯誤,但我也沒有看到任何東西在管道中。這可能是我的錯 - 我正在用.NET的NamedPipeServerStream讀取管道,也許我沒有把它設置正確。我即將崩潰,但明天我會嘗試一些閱讀管道的替代方法,並閱讀OS.File。 – FSharpN00b

+0

'writeAtomic'會做一個「寫入temp,然後移動/重命名/替換」舞蹈。您不能用文件替換(Windows IIRC上的「MoveFileEX」)命名管道。 ;)但是,常規的'OS.File.open/.write'可能工作。另外,請確保正確使用承諾,例如通過['Task.jsm'](https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Task.jsm)。 – nmaier

+0

謝謝你的回覆。我嘗試了OS.File.write,我可以寫入一個文件,但又沒有看到管道中顯示的任何內容。這可能仍然是我在.NET方面做錯了。我今天沒有花費盡可能多的時間,但是明天我會繼續玩。 – FSharpN00b