如果没有程序可以打开文件,则捕获打开文件

本文关键字:文件 程序 如果没有 | 更新日期: 2023-09-27 18:14:21

我的代码

var info = new ProcessStartInfo(path);
info.WorkingDirectory = path;
info.WindowStyle = ProcessWindowStyle.Maximized;
var p = Process.Start(info);

它将打开一个文件(.pdf,但稍后可能是另一种类型的文件)在某些情况下,没有安装打开它的程序,所以它会显示windows消息

Windows无法打开此文件

并让我搜索一些程序来打开它。

我怎样才能避免这种情况?我想展示另一条信息。在try/catch中,它不会抛出任何类型的异常,所以它不起作用。

我试过了,如果只有。pdf来检测是否有任何程序安装在这个

var key = Registry.ClassesRoot.OpenSubKey(".pdf");
if(key != null)
//  Not installed!

但它不起作用。我得到了一个密钥,但我已经卸载了Foxit阅读器(我也使用CCleaner来删除冲突密钥,但仍然有。pdf密钥)

请帮

如果没有程序可以打开文件,则捕获打开文件

您可以使用FindExecutable() API, 但是被检查的文件必须实际存在:

    [System.Runtime.InteropServices.DllImport("shell32.dll")]
    static extern IntPtr FindExecutable(string lpFile, string lpDirectory, StringBuilder lpResult);
    private void Button1_Click(System.Object sender, System.EventArgs e)
    {
        string path = @"C:'Users'Mike'Documents'SomeFile.xyz";
        string EXE = GetAssociatedExecutable(path);
        if (!string.IsNullOrEmpty(EXE))
        {
            MessageBox.Show(EXE, "Associated Executable");
        }
        else
        {
            MessageBox.Show("No Asssociated Executable for: " + path);
        }
    }
    private string GetAssociatedExecutable(string filename)
    {
        const int MAX_PATH = 260;
        if (System.IO.File.Exists(filename))
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder(MAX_PATH);
            FindExecutable(filename, null, sb);
            if (sb.Length > 0)
            {
                return sb.ToString();
            }
        }
        return "";
    }