我試圖訪問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
一些實驗後,我能夠從管道讀取,但寫入失敗。我會繼續嘗試。在一邊(.net)注意,'NamedPipeClientStream'構造函數將管道名稱作爲參數,而不是完整路徑。 – paa
你還有這個需求嗎?我現在有很多'ctypes'的經驗,這個東西很容易在'js-ctypes'中完成。 – Noitidart