从C#中的进程获取文件的完整路径?

时间:2017-07-23 11:05:41

标签: c#

private static string getPath(object id11)
    {
        string wmiQuery = string.Format("select CommandLine from Win32_Process where ProcessId={0}", id11);
        using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery))
        {
            using (ManagementObjectCollection retObjectCollection = searcher.Get())
            {
                foreach (ManagementObject retObject in retObjectCollection)
                {
                    if (retObject["CommandLine"] != null)
                    {
                         string s= (string.Format("[{0}]", retObject["CommandLine"]));
                        string k = s.Substring(s.IndexOf("EXE")+4);
                        k = k.Remove(k.IndexOf("]"));
                        return k;
                    }
                    return null;
                }
                return null;
            }
        }

我使用此代码获取记事本的完整路径。使用双击打开记事本文件时,此代码可正常工作。但是当我在记事本中打开文件时(文件 - >打开)...比这个代码无法获得完整路径。有没有办法找到像这样打开文件的路径。还有一件事我需要文件路径而不是记事本可执行路径。或者建议我一些其他解决方案。

1 个答案:

答案 0 :(得分:1)

您的代码查看发送到进程的命令行参数。正如您所发现的那样,当您双击文件(.txt或.doc)时,它可能会作为命令行参数发送到该文件。在这些情况下,您的解决方案正确地找到了文件。

但是,当您从应用程序打开文件时,没有命令行参数。

一种方法是使用Handle之类的工具来获取打开文件的进程列表。

屏幕截图示例:

enter image description here

您可以使用Process类来运行它并解析输出。

某些进程(如记事本)不会锁定文件。因此,此工具不会为您提供这些文件的名称。