使用C#在Windows中为已知的shell类型创建新文件

时间:2016-05-08 08:35:59

标签: c# windows shell

Windows shell允许通过其扩展名将文件类型与特定应用程序相关联。此关联通常提供ShellNew命令,该命令允许使用应用程序提供的默认模板创建给定类型的新文件。在Windows资源管理器的上下文菜单中选择New时,它提供了一系列不同的文件类型,可以通过这种方式创建。我想从我的C#应用​​程序实现此操作。

如下打开现有文件是微不足道的。

System.Diagnostics.ProcessStartInfo psi = 
  new System.Diagnostics.ProcessStartInfo(path);
psi.UseShellExecute = true;
System.Diagnostics.Process.Start(psi);

如果传递现有文件的任何有效路径,其扩展名为shell“Open”命令注册,它将在其默认应用程序中打开给定文件。 例如,传递path = "text.txt",记事本将为您打开“text.txt”。

但是,我找不到以类似方式创建新文件的代码。

例如,Microsoft Word是“新”命令的注册应用程序。我可以直接从Windows资源管理器创建带有默认模板的新MS Word文档,而无需打开MS Word。我想在我的C#应用​​程序中完全相同:创建新的MS Word文件而不链接到MS Word自动化。

我确信可以对在Windows shell中为“新”命令正确注册的任何文件类型执行操作。但奇怪的是,我所尝试的所有标准搜索都没有涵盖这个主题。

提议的解决方案

在绝望找到任何准备好的代码片段后,我已经编写了这个函数来从注册表中提取信息。它从请求的完整路径到新文件获得文件扩展名。然后它找到给定扩展名的关联类信息,并从“ShellNew”子项中提取“FileName”值。最后,它将模板从注册表中找到的路径复制到新文件的所需目标。

public static bool CreateFileOfKnownType(string path)
{
  try
  {
    string extension = System.IO.Path.GetExtension(path);
    if (string.IsNullOrEmpty(extension)) return false;

    using (var rExt = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(extension))
    {
      string[] apps = rExt.GetSubKeyNames();
      foreach (string app in apps)
      {
        if (app.Contains("."))
        {
          string shellNew = apps[0] + "\\ShellNew";
          using (Microsoft.Win32.RegistryKey rApp = rExt.OpenSubKey(shellNew))
          {
            string newFileTemplate = rApp.GetValue("FileName").ToString();
            System.IO.File.Copy(newFileTemplate, path);
            return true;
          }
        }
      }
    }
    return false;
  }
  catch { return false; }
}

当“FileName”包含应用程序模板的完整路径时,此代码在某些情况下可以正常工作。但是,在其他情况下,“FileName”仅包含没有完整路径的模板的文件名。然后这段代码失败了。如果有人知道这种改进会普遍起作用,那将非常感激。

1 个答案:

答案 0 :(得分:-1)

您需要操作注册表来创建这些关联 - 通常这是在软件安装过程中完成的。

有关如何在https://msdn.microsoft.com/en-gb/library/windows/desktop/cc144156%28v=vs.85%29.aspx

创建注册表项的详细信息