Eri*_*ham 13 c# file-extension
有时需要让您的应用程序打开文件的默认应用程序.例如,要打开PDF文件,您可以使用:
System.Diagnostics.Process.Start("Filename.pdf");
Run Code Online (Sandbox Code Playgroud)
要打开图像,您只需使用具有不同文件名的相同代码:
System.Diagnostics.Process.Start("Filename.gif");
Run Code Online (Sandbox Code Playgroud)
一些扩展(例如.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;
}
Run Code Online (Sandbox Code Playgroud)
Yah*_*hia 27
我建议按照大卫的答案中的建议,但因为你需要检测一个关联:
要检查文件是否具有关联,您可以使用本机函数FindExecutable,这基本上是Windows资源管理器内部使用的... SE_ERR_NOASSOC如果没有关联,它会提供一个很好的错误代码().成功后,它会提供相应可执行文件的路径.
你DllImport是的
[DllImport("shell32.dll")]
static extern int FindExecutable(string lpFile, string lpDirectory, [Out] StringBuilder lpResult);
Run Code Online (Sandbox Code Playgroud)
另一个选择是走路注册表例如(由于像WoW64等几个地方因为复杂而不推荐使用):
真正的关联存储在HKEY_CLASSES_ROOT\.pdf指向的键中- 在我的情况下AcroExch.Document,所以我们结帐HKEY_CLASSES_ROOT\AcroExch.Document.在那里,您可以看到(并更改)将用于启动该类型文件的命令:
HKEY_CLASSES_ROOT\AcroExch.Document\shell\open\command
Run Code Online (Sandbox Code Playgroud)
@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);
Run Code Online (Sandbox Code Playgroud)