C# 如何从Registry/LocalMachine/Software/Classes/.docx/shell/Open/Command中的默认值获取应用程序名称

C# 如何从Registry/LocalMachine/Software/Classes/.docx/shell/Open/Command中的默认值获取应用程序名称,c#,windows,registry,C#,Windows,Registry,我需要知道从Registry/LocalMachine/Software/Classes/.docx/shell/Open/Command获取应用程序名称的最有效方法。比如从这个 C:\Program Files(x86)\Microsoft Office\Office15\POWERPNT.EXE“%1”/ou“%u” 我只需要“POWERPNT.EXE”。子字符串和替换无效,因为其中的值显示不同。比如说 “C:\ProgramFiles(x86)\Microsoft Office\Offic

我需要知道从Registry/LocalMachine/Software/Classes/.docx/shell/Open/Command获取应用程序名称的最有效方法。比如从这个

C:\Program Files(x86)\Microsoft Office\Office15\POWERPNT.EXE“%1”/ou“%u”

我只需要“POWERPNT.EXE”。子字符串和替换无效,因为其中的值显示不同。比如说

“C:\ProgramFiles(x86)\Microsoft Office\Office15\EXCEL.EXE”/dde

“C:\Program Files(x86)\Skype\Phone\Skype.exe”“/uri:%l”

我在这里遇到的真正问题是,我正在检索的字符串可能包含命令行参数以及指向可执行文件的路径,对于这些可执行文件,substring和replace将不再有用

我的方法的目的是找出用于打开相关文件类型的程序,然后使用Process.Start(“EXCEL.EXE”,fileURL)从SharePoint文档库中打开文件。在几乎所有情况下,都应该可以很好地工作。它返回一个字符串数组,其中第一个元素是可执行文件的路径

然后,您所需要做的就是删除引号(如果有的话)以及直到最后一个反斜杠的所有内容


可能有(也可能没有)病理情况下,此函数不会像Explorer那样解释字符串。我认为除了通过实验之外,没有任何方法可以确定这一点。

有什么东西喜欢这项工作吗

public static string GetFileName(string input)
{
    int extensionIndex = input.IndexOf(".exe", StringComparison.OrdinalIgnoreCase);
    if (extensionIndex < 0) return string.Empty;
    return Path.GetFileName(input.Replace("\"", "").Substring(0, extensionIndex + 4));
}

// Or, if you want to get the full path:
public static string GetFilePath(string input)
{
    int extensionIndex = input.IndexOf(".exe", StringComparison.OrdinalIgnoreCase);
    if (extensionIndex < 0) return string.Empty;
    return input.Replace("\"", "").Substring(0, extensionIndex + 4);
}

对初始问题的评论澄清了实际问题

我的方法的目的是找出用于 打开关联的文件类型,然后使用 Process.Start(“EXCEL.EXE”,fileURL)打开文件

如果您只需要在关联的应用程序中打开给定的文件,则不需要读取注册表或解析命令行

您可以通过调用另一个重载的
Process.Start
打开文件,该重载包含一个参数

Process.Start(fileURL);
根据MSDN:,参数是要在流程中运行的文档或应用程序文件的名称

我测试了本地文件,如“C:\folder\test.txt”和URL

Process.Start(@"C:\folder\test.txt"); // Opens test.txt in Notepad


您是在询问如何读取注册表,还是如何解析读取注册表返回的路径?我现在能够读取注册表及其内部的值。我的问题是,当我从键中获取值时,我如何才能仅获取.exe部分以获取EXCEL.exe、Skype.exe等。我的方法的目的是找出用于打开相关文件类型的程序,然后使用进程。启动(“EXCEL.exe”,fileURL)打开文件如果您已经可以读取注册表,这是您的问题,“如何仅从完整文件路径获取文件名?“。或者别的什么?对不起,我在编辑我的评论,你能参考我上面的评论吗?”?提前感谢。:)@RufusL:比这要复杂一点,因为他正在检索的字符串可能包含命令行参数以及可执行文件的路径。@RufusL:你当然可以P/调用它?好的,如果有一个.NET等价物,那就更好了,但我不知道是否有。另一种方法是在C运行时库中找到解析命令行的代码,并将其移植到C#。(请注意,不一定与Explorer完全相同。)它只会打开本地文件,但如果您输入url,它将继续下载文件(请提供您试图打开的文件URL示例?@user1166085谢谢。我发现您想打开Word文档的内部网地址。这是因为MS Office知道如何从URL打开文件。但并非所有应用程序都能够从URL打开文件。您考虑过从URL下载文件吗首先以编程方式将其保存到本地文件,然后使用Process.Start(localFile)方法?例如,有使用powershell下载文件的示例。我也发现了这一问题。由于我的应用程序的主要目的是允许用户从SharePoint文档库上载/下载/编辑文档,因此我需要使用该过程。对于Office文档,启动该过程将允许用户直接对SharePoint文档库中的副本进行更改。对于其他文件类型,我可能会允许用户按照您提到的方式保存文件类型。感谢您指出!已更新以包含获取完整路径的解决方案。您好!这似乎对我起到了作用。我们正在测试其他扩展名,这似乎很有用工作很好。哦!除了你的方法会在“Skype.exe”后面留下一个空格,这可以通过使用Replace轻松解决。非常感谢!)
Process.Start(@"C:\folder\test.txt"); // Opens test.txt in Notepad
Process.Start("http://regmagik.com/index.htm"); // Opens web page in the browser