如何使用默认浏览器打开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文件并在查看后将其删除?

如何使用默认浏览器打开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

希望对您有所帮助。