有时需要让您的应用程序打开文件的默认应用程序。例如,要打开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;
}
答案 0 :(得分:26)
我建议您遵循David's answer中的建议,因为您需要检测关联:
要检查文件是否具有关联,您可以使用本机函数FindExecutable
,这基本上是Windows资源管理器内部使用的...如果没有,它会提供一个很好的错误代码(SE_ERR_NOASSOC
)协会。成功后,它会提供相应可执行文件的路径。
Thee 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
答案 1 :(得分:5)
在这种情况下,最好的方法是尝试打开文档并检测故障。尝试预测文件关联是否到位只会导致您重新实现shell执行API。因为它们已经存在,所以很难完全正确而且不必要!
答案 2 :(得分:4)
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);
答案 3 :(得分:1)
您也将查看注册表以获取该信息。
您可以关注:
HKEY_CLASSES_ROOT\.extension
它通常会导致类似HKEY_CLASSES_ROOT\extfile\Shell\Open\Command
然后您将来命令打开文件类型。
根据您的工作情况,请求宽恕(即打开文件并查看)可能是理想的。
答案 4 :(得分:1)
所有这些信息都存在于注册表中..您可以导航到HKEY_CLASSES_ROOT,找到扩展名并从那里找到默认处理程序。但是根据文件的类型和相关的处理程序,您需要涉及到CLSID以及诸如此类的......您可能最好不要再捕获异常。
答案 5 :(得分:1)
此信息在注册表中。例如:
# 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")