【问题标题】:How to know which process will be fired by a certain file in c#如何知道c#中的某个文件将触发哪个进程
【发布时间】:2011-06-20 20:02:56
【问题描述】:

我想知道在文件开始之前会触发哪个进程:

Process.Start("PathToFile");

那我想知道进程的路径。

谢谢。

【问题讨论】:

  • 您想在开始过程之前/不知道它吗?
  • 您是在指定实际路径(“%systemroot%\system32”),还是像“notepad.exe”这样的无路径程序名称?
  • 您是否正在尝试运行记事本之类的程序?还是您要打开一个文档,例如 recipes.doc?
  • @agent-j .doc、.docx 和 .pdf
  • 我能想到的唯一解决方案是读取注册表项并模仿 shell 逻辑。这显然是邪恶的。

标签: c# file process io


【解决方案1】:

可以查看Process.Start返回的Process的MainModule属性:

Process p = Process.Start(@"D:\\test.txt");
string executableStarted = p.MainModule.FileName; // full path to notepad.exe

但是,您应该记住 Proces.Start 的返回值可能为 null - 根据 MSDN,返回值为:

一个新的 Process 组件是 与进程资源相关联, 或 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 + @"\shell\open\command");
string command = cmdKey.GetValue(null) as string;

【讨论】:

  • 邪恶,但我想不出更好的了。
  • 谢谢。我认为您的答案在大多数情况下应该有效。但在我的情况下,注册表并不能准确反映 Process.Start() 将启动的内容。我已经在我的电脑上安装了 Office word 2010,然后我安装了 Word 2007 来测试一些东西。在注册表中,.doc 和 docx 应该以 2007 字打开,但它以 2010 字打开......真的很奇怪。但是您绝对应该为此答案赢得更多声誉。
【解决方案2】:

它返回一个包含更多信息的 Process 对象。 MainModule 可能是适合您的属性。

http://msdn.microsoft.com/en-US/library/system.diagnostics.process.mainmodule(v=VS.80).aspx

编辑:

你想知道之前/之后 开始这个过程? -是的

您可以在注册表中查找已注册的文件处理程序 - 对于 .doc、.txt 等。

【讨论】:

    【解决方案3】:

    要使用 windows 文件关联打开的文档

    我在这里找到了解释如何创建文件关联的链接。 This may help. 当然你需要阅读注册表。我知道有两种格式。

    你不知道路径的程序

    路径环境变量在当前目录之后作为默认路径进行查询,以在未提供路径时进行查找。 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 的链接。 编辑:添加了另一个link

    【讨论】:

    • @Jean,对不起。在我了解您正在打开文件之前,我编写了此代码。我以为你正在尝试运行一个你不知道路径的程序。
    • @Jean,我不知道有什么灵丹妙药。我添加了一个您应该查看的链接。
    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    相关资源
    最近更新 更多