【问题标题】:Send plain text to Firefox向 Firefox 发送纯文本
【发布时间】:2012-06-13 00:44:18
【问题描述】:

我有一个关于在 Firefox 中查看文本的直截了当的问题。我的应用程序正在生成一些我需要在 Firefox 中查看的文本。如果我保存一个 .txt 文件并在 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);
   }

【问题讨论】:

标签: c# firefox temporary-files


【解决方案1】:

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

【讨论】:

  • +1。感谢您提供此信息 - 我以前从未见过此信息,并且惊讶地发现它在打开的 Firefox 实例(不带引号)中也能正常工作。
  • 引号是我尝试从命令行启动它时使用的,否则字符串将被视为参数数组,Fx 将为每个单词打开选项卡。
  • 关于数据 uris 最好的部分是 base64 一些 html/javascript 并将其嵌入到一个经过严格测试的有限格式支持站点中以用于一些简单的 xss。
  • 是的,我知道引号的用途;这就是为什么我提到在活动 FF 窗口中不需要它们。至于“最好的部分”,我没有发现 xss 利用了任何东西的“最好的部分”。
  • 我是一名 QA。找到它们很有趣。
【解决方案2】:

我会在用户 TEMP 文件夹中创建特定于应用程序的子文件夹并将文件存储在那里。

这样做我会假设除了我之外没有其他人会写入该文件夹。

每次运行Process.Start 代码时,都需要使用过滤器“文件创建时间超过 30 分钟”(值可以不同)从该文件夹中删除所有文件。

在最坏的情况下,该文件夹中会有一些文件,但文件数量不会增加。

【讨论】:

    【解决方案3】:

    您可以在这里采取几种方法。最危险的方法是打电话给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 );
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-16
      • 2018-05-26
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      相关资源
      最近更新 更多