繁体   English   中英

应用程序是否与给定的扩展名相关联?

[英]Is an Application Associated With a Given Extension?

有时希望您的应用程序打开文件的默认应用程序。 例如,要打开PDF文件,您可以使用:

System.Diagnostics.Process.Start("Filename.pdf");


要打开图像,只需使用相同的代码,但使用不同的文件名:

System.Diagnostics.Process.Start("Filename.gif");


某些扩展名(例如.gif)几乎总是具有默认处理程序,即使在基本Windows安装中也是如此。 但是,某些扩展名(例如.pdf)通常没有安装用于处理它们的应用程序。

在这些情况下,最好在调用Process.Start(fileName)之前确定应用程序是否与您要打开的文件的扩展名相关联。

我想知道您如何最好地实现这样的事情:

static bool ApplicationAssociated(string extension)
{
    var extensionHasAssociatedApplication = false;

    var condition = // Determine if there is an application installed that is associated with the provided file extension.;
    if (condition)
    {
        extensionHasAssociatedApplication = true;
    }

    return extensionHasAssociatedApplication;
}

由于您需要检测关联,因此我建议遵循David's Answer BUT中的建议:

要检查文件是否具有关联,可以使用本机函数FindExecutable ,这基本上是Windows资源管理器内部使用的功能...如果没有关联,它将给出一个不错的错误代码( SE_ERR_NOASSOC )。 成功后,它会提供到相应可执行文件的路径。

您的DllImport

[DllImport("shell32.dll")]
static extern int FindExecutable(string lpFile, string lpDirectory, [Out] StringBuilder lpResult);

另一个选择是例如遍历注册表(不建议这样做,因为由于诸如woW64之类的多个字母比较复杂):

真正的关联存储在HKEY_CLASSES_ROOT\\.pdf指向的密钥中(在我的情况下是AcroExch.Document ,因此我们签出HKEY_CLASSES_ROOT\\AcroExch.Document 在这里,您可以看到(并更改)将用于启动该类型文件的命令:

HKEY_CLASSES_ROOT\AcroExch.Document\shell\open\command

在这种情况下,最好的方法是尝试打开文档并检测故障。 尝试预测文件关联是否到位只会导致您重新实现Shell执行API。 由于它们已经存在,很难做到完全正确且相当不必要!

@Yahia得到了点头。 我正在发布我的后代快速解决方案,以便您可以了解我的工作。 可以对该代码进行很多可能的改进,但这将使您有一个想法:

public static bool HasExecutable(string path)
{
    var executable = FindExecutable(path);
    return !string.IsNullOrEmpty(executable);
}

private static string FindExecutable(string path)
{
    var executable = new StringBuilder(1024);
    FindExecutable(path, string.Empty, executable);
    return executable.ToString();
}

[DllImport("shell32.dll", EntryPoint = "FindExecutable")]
private static extern long FindExecutable(string lpFile, string lpDirectory, StringBuilder lpResult);

您也将在注册表中查看该信息。

您可以遵循:

HKEY_CLASSES_ROOT\.extension

它通常会导致类似HKEY_CLASSES_ROOT\\extfile\\Shell\\Open\\Command

然后您将进入命令以打开文件类型。

根据您的操作,最好是请求宽恕(即,打开文件并查看)

所有这些信息都保存在注册表中。您可以导航到HKEY_CLASSES_ROOT,找到扩展名,然后从那里查找默认处理程序。 但是根据文件的类型和相关的处理程序,您需要涉足CLSID,而不是……您最好捕获一个异常。

此信息在注册表中。 例如:

# Mount the HKCR drive in powershell
ps c:\> new-psdrive hkcr registry hkey_classes_root
ps c:\> cd hkcr:\.cs

# get default key for .cs
PS hkcr:\.cs> gp . ""
(default)    : VisualStudio.cs.10.0
...

# dereference the "open" verb
PS hkcr:\.cs> dir ..\VisualStudio.cs.10.0\shell\open

    Hive: hkey_classes_root\VisualStudio.cs.10.0\shell\open

Name                           Property
----                           --------
Command                        (default) : "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe" /dde
ddeexec                        (default) : Open("%1")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM