2012-06-13 43 views
1

我有一個關於在Firefox中查看文本的非常簡單的問題。我的應用程序正在生成一些我需要在Firefox中查看的文本。如果我保存一個.txt文件並在Firefox中打開該文件,那麼瀏覽器的其中一個插件就可以利用這些文本並完成它需要做的事情。發送純文本到Firefox

我一直在通過創建一個臨時文件,將文本寫入它,然後在Firefox中打開文件來完成此操作。問題是,我需要刪除該文件一旦它被餵養到Firefox,所以我沒有數以百計的這些謊言。我正在使用臨時文件方法,因爲我無法找到有關在瀏覽器參數中傳遞一些純文本的信息。

不管怎樣,這是我現在所擁有的,你可以看到我的File.Delete實際上在Firefox可以到達之前刪除文件。如果我更慢地瀏覽代碼,那很好。

任何想法?

try 
{ 
    string fileName = Path.GetTempFileName(); 
    FileInfo fileInfo = new FileInfo(fileName); 
    fileInfo.Attributes = FileAttributes.Temporary; 

    string writetext = "text I need in a Firefox page"; 
    File.WriteAllText(fileName, writetext); 

    ProcessStartInfo startInfo = new ProcessStartInfo(); 
    startInfo.FileName = "firefox.EXE"; 
    startInfo.Arguments = fileName; 
    Process.Start(startInfo); 

    if (File.Exists(fileName)) 
    { 
     File.Delete(fileName); 
    } 

    } 
    catch (SystemException ex) 
    { 
    MessageBox.Show("An error occured: " + ex.Message); 
    } 
+0

您需要等到進程啓動。也許下面的線程將是有用的: [使一個Process.Start等待,直到進程啓動](http://stackoverflow.com/questions/6390030/c-sharp-making-a-process-start-wait - 進程已啓動) –

回答

4

或者,您也可以使用data URI來替代,例如, firefox.exe "data:text/plain,Lorem ipsum dolor sit amet"

+0

+1。感謝這個信息 - 我以前從未見過這個信息,並且很驚訝地發現它在一個打開的Firefox實例(不帶引號)中也能正常工作。 –

+1

當我試圖從命令行啓動它時,引號是用於輸入的,否則將字符串視爲參數數組,Fx將打開每個單詞的選項卡。 –

+0

關於數據uris的最佳部分是base64一些html/javascript,並將其嵌入到一個經過嚴格測試的限制格式支持站點中,用於一些簡單的xss。 –

0

我會在用戶TEMP文件夾中創建特定於應用程序的子文件夾,並在那裏存儲文件。

這樣做,我會假設沒有人會寫入該文件夾,但我。

每次運行代碼Process.Start所有文件都需要使用過濾器「文件創建超過30分鐘前」(值可能不同)從該文件夾中刪除。

在最壞的情況下,該文件夾中會有幾個文件,但文件數量不會增長。

0

有幾種方法你可以在這裏。最危險的方法是撥打電子郵件Thread.Sleep(5000),只希望Firefox有足夠的時間閱讀文件,然後再刪除它。但是,在一個非常緩慢的系統上,這可能還不夠。

更好的方法是等到進程刪除文件前退出:

var p = Process.Start(startInfo); 
p.WaitForExit(); 
if(File.Exists(fileName)) { 
    File.Delete(fileName); 
} 

這當然會阻止你的調用程序,直到Firefox的退出。還有另一種選擇,那就是等待Exited事件:

var p = Process.Start(startInfo); 
p.Exited += FirefoxExited; 

// ... 

void FirefoxExited(object sender, EventArgs e) { 
    if(File.Exists(fileName)) 
     File.Delete(fileName); 
}