2015-06-16 15 views
1

我尝试打开临时HTML文件的默认浏览器,并删除该文件,然后:如何使用默认浏览器打开HTML文件,并在用户查看后删除它?

 var tempFileName = Path.ChangeExtension(Path.GetTempFileName(), "html"); 
     // I save document to temp file here... 

     Process process = null; 
     try 
     { 
      process = Process.Start(tempFileName); 
     } 
     catch (Win32Exception) 
     { 
     } 
     catch (ObjectDisposedException) 
     { 
     } 
     catch (FileNotFoundException) 
     { 
     } 

     var worker = new BackgroundWorker(); 
     worker.DoWork += (s, we) => { 
      if (process != null) 
      { 
       process.WaitForExit(); 
       try 
       { 
        File.Delete(tempFileName); 
       } 
       catch (IOException) 
       { 
       } 
      } 
     }; 
     worker.RunWorkerAsync(); 

不幸的是,Process.Start,则返回null一个进程没有启动,但运行一个被使用(新标签在谷歌开通铬)。所以我不能等待这个过程退出。

所以,一个普遍的问题是:如何完成这项任务?如何向用户显示临时HTML文件并在查看后将其删除?

+1

等待几秒钟然后删除文件? (浏览器不应该锁定它)虽然这会阻止刷新 –

+0

詹姆斯邦德的东西在这里...... – Botonomous

+0

这将防止刷新。用户可能会发现这个文件丢失在一个奇怪的磁盘上。 –

回答

0

您可以强制新的浏览器实例,首先搞清楚的默认浏览器,并手动执行它:

public Process launchBrowser(string url) 
{ 
    string browserName = "iexplore.exe"; 
    using (RegistryKey userChoiceKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice")) 
    { 
     if (userChoiceKey != null) 
     { 
      object progIdValue = userChoiceKey.GetValue("Progid"); 
      if (progIdValue != null) 
      { 
       if(progIdValue.ToString().ToLower().Contains("chrome")) 
        browserName = "chrome.exe"; 
       else if(progIdValue.ToString().ToLower().Contains("firefox")) 
        browserName = "firefox.exe"; 
       else if (progIdValue.ToString().ToLower().Contains("safari")) 
        browserName = "safari.exe"; 
       else if (progIdValue.ToString().ToLower().Contains("opera")) 
        browserName = "opera.exe"; 
      } 
     } 
    } 

    return Process.Start(new ProcessStartInfo(browserName, url)); 
} 

然后你就可以得到一个处理过程:

var process = launchBrowser("www.google.com"); 

process.WaitForExit(); 

try 
{ 
    //Do whatever 
} 
catch (IOException) 
{ 
} 
+1

这是可能的,但有点复杂和不安全 –

+0

'WaitForExit()'不等待Chrome退出... –

+1

我认为这个想法是复杂和不安全的! –

1

如果您使用ProcessStartInfo并设置UseShellExecute,那么您可以通过直接“运行”HTML来启动用户的默认浏览器,就像您现在要做的那样。我还没有尝试过,但它应该会给你一个Process以确定用户何时关闭浏览器。

我仍然会准备一堆无法控制的边缘案例。例如,如果他们打开浏览器,但关闭正在浏览器的应用程序。那时你是否让浏览器保持活着?你杀了它吗?你什么时候删除HTML文件?使用Web Browser控件可能会更好。那么你甚至不必担心其他进程或浏览器兼容性。您甚至可以将HTML内容流式传输到控件,并且以后没有要删除的文件。

+0

使用'ShellExecute'属性没有帮助:当我将它设置为'false'时,该文件根本没有打开。至于'WebBrowser',我不太喜欢这个解决方案:它依赖于IE,据我所知,在WebBrowser中使用浏览器带来的所有功能并不容易:工具栏,选项卡等等。但是你是对的,用户可能会关闭程序并保留浏览器。那么实际上没有什么可做的。还有一种可能的解决方案是删除应用程序退出时的文件... –

+1

它不应该是错误的。你确实需要使用shell,所以它必须是真实的。但是这听起来像你会回到现在的船(Process.Start返回null) –

+0

是的,它是如此。返回的'Process'为空。 –

相关问题