如何使用默认浏览器打开HTML文件并在用户查看后将其删除
本文关键字:用户 删除 默认浏览器 何使用 文件 HTML | 更新日期: 2023-09-27 17:56:26
我尝试使用默认浏览器打开临时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文件并在查看后将其删除?
使用ProcessStartInfo
并设置UseShellExecute
那么您可以通过直接"运行"HTML来启动用户的默认浏览器,就像您现在尝试的那样。我还没有尝试过,但它应该给你一个Process
,以确定用户何时关闭浏览器。
我仍然会为一堆您无法控制的边缘情况做准备。例如,如果他们让浏览器保持打开状态,但关闭正在监视浏览器的应用程序。在这一点上,你让浏览器保持活力吗?你杀了它吗?何时删除 HTML 文件?最好使用 Web 浏览器控件。然后,您甚至不必担心其他进程或浏览器兼容性。您甚至可以将 HTML 内容流式传输到控件,并且以后没有要删除的文件。
您可以强制创建新的浏览器实例,方法是首先确定默认浏览器,然后手动执行它:
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)
{
}
您还可以使用 WebClient 将 html 内容读入内存流或字符串变量,关闭流或 WebClient 后,文件将被释放,准备删除,因为您不再需要它。
他们在内存中有html内容,只需将其发送到浏览器即可。
如果需要,这里有一些示例:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/060ea8e0-cc63-44a3-b0dc-b531c29b8a0f/read-html-content-using-cnet?forum=csharpgeneral
希望对您有所帮助。