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”仅包含没有完整路径的模板的文件名。然后这段代码失败了。如果有人知道这种改进会普遍起作用,那将非常感激。
答案 0 :(得分:-1)
您需要操作注册表来创建这些关联 - 通常这是在软件安装过程中完成的。
有关如何在https://msdn.microsoft.com/en-gb/library/windows/desktop/cc144156%28v=vs.85%29.aspx
创建注册表项的详细信息