我想知道在文件启动之前会启动哪个进程:
Process.Start("PathToFile");
然后我想知道这个过程的路径。
谢谢。
您可以查看从Process返回的Process的MainModule
属性。开始:
Process p = Process.Start(@"D:\test.txt");
string executableStarted = p.MainModule.FileName; // full path to notepad.exe
但是,您应该记住Proces的返回值。Start可能为null——根据MSDN,返回值为:
一个新的流程组件与过程资源相关联,或null,如果没有进程资源已启动(例如,如果过程被重复使用)。
更新
为了在启动进程之前了解可执行文件,您必须查看注册表中的HKEY_CLASSES_ROOT。这将是从文件名转到shell在打开文件时执行的命令的代码:
string extension = Path.GetExtension(path);
var regClasses = Microsoft.Win32.Registry.ClassesRoot;
var extensionKey = regClasses.OpenSubKey(extension);
var typeKey = extensionKey.GetValue(String.Empty);
var cmdKey = regClasses.OpenSubKey(typeKey + @"shellopencommand");
string command = cmdKey.GetValue(null) as string;
http://msdn.microsoft.com/en-US/library/system.diagnostics.process.mainmodule(v=VS.80).aspx
编辑:
你想事先知道吗启动流程-是
您可以在注册表中查找已注册的文件处理程序,例如.doc、.txt等。
要使用windows文件关联打开的文档
我在这里找到了这个链接,它解释了如何创建文件关联。这可能会有所帮助。当然,您需要阅读注册表。我知道有两种格式。
不知道路径的程序
路径环境变量在当前目录之后作为默认路径进行查询,以便在未提供路径时查找。Path环境变量可以在这里为您提供帮助。
public static string GetPath (string pathToFile)
{
string fileNameOnly = Path.GetFileName(pathToFile);
List<string> folders = Environment.GetEnvironmentVariable("Path").Split(';').ToList ();
folders.Insert(0, Environment.CurrentDirectory);
foreach (string folder in folders)
{
string fileName;
try
{
// Can't trust that the Path environment variable is constructed correctly.
fileName = Path.Combine(folder, fileNameOnly);
}
catch
{
continue;
}
if (File.Exists(fileName))
return fileName;
}
return null;
}
编辑:添加链接到MS:path。编辑:添加了另一个链接。