C#:如何获取给定无路径文件时Process.Start将使用的可执行路径?

拉尔金

System.Diagnostics.Process.Start()方法接受ProcessStartInfo用没有路径的可执行文件初始化类实例,例如Notepad.exe该过程开始后,您可以找到其使用的完整路径,例如C:\Windows\SysWOW64\notepad.exe这是完美的,除非您想在不实际启动程序的情况下了解完整路径。就我而言,我想提前从可执行文件中获取图标。

这类似于Windows“ where”命令的行为,例如:

C:>where notepad.exe
C:>\Windows\System32\notepad.exe
C:>\Windows\notepad.exe

第一个响应C:\Windows\System32\notepad.exe与“ Process”所使用的基本相同。

博士

搜索路径的顺序实际上与注册表有关,因此不能保证仅通过PATH环境变量进行枚举即可产生预期的结果,尤其是在当前工作目录中存在具有预期名称的文件的情况下。为了可靠地获取可执行文件路径,您将需要SearchPath在Kernel32中调用Win32函数。

没有公开的框架.NET函数SearchPath,但是可以通过P / Invoke直接调用该函数

下面的示例程序说明了此功能的用法。如果notepad.exe存在于系统搜索路径中,则按照系统配置,它将打印路径;否则,系统将显示路径。如果不存在,它将打印“找不到文件”。

using System;
using System.Text;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern uint SearchPath(string lpPath,
         string lpFileName,
         string lpExtension,
         int nBufferLength,
         [MarshalAs ( UnmanagedType.LPTStr )]
             StringBuilder lpBuffer,
         out IntPtr lpFilePart);
    const int MAX_PATH = 260;
    public static void Main()
    {
        StringBuilder sb = new StringBuilder(MAX_PATH);
        IntPtr discard;
        var nn = SearchPath(null, "notepad.exe", null, sb.Capacity, sb, out discard);
        if (nn == 0)
        {
            var error = Marshal.GetLastWin32Error();
            // ERROR_FILE_NOT_FOUND = 2
            if (error == 2) Console.WriteLine("No file found.");
            else
                throw new System.ComponentModel.Win32Exception(error);
        }
        else
            Console.WriteLine(sb.ToString());
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 C++ 中使用 AssocQueryString 获取可执行路径

UWA C#获取XML文件的可执行路径

如何找到php的可执行路径?

Windows Update可执行路径

Bash选项获取已解析的可执行路径?

如何通过此pid执行的文件获取pid及其可执行路径信息?

删除特定可执行路径的bash哈希

Pycharm:Conda 可执行路径为空

通过可执行路径限制进程的CPU时间

可执行路径必须在Python的PATH中

如何获取给定路径的文件系统的UUID?

如何从.desktop文件中的可执行路径获取期望的进程名称

无法获取.net core 3.0单个文件'/ p:PublishSingleFile = true'的原始可执行路径

使用Anaconda / Miniconda Python在Atom程序包(即自动完成Python)中设置Python可执行路径

JavaScript执行路径

如何在Emacs的配置文件上为程序包设置可执行路径?

如何使用 dlopen() 获取可执行文件路径

Bash:如何执行路径

用环境设置的可执行路径编写系统单元文件

如何修复导致“ubuntu 内部错误”的不存在的可执行路径?

使用launch4j时如何获取可执行文件的路径?

为什么 TypeScript 会显示不可执行路径的错误?

在 Rider IDE 中为 Web 项目更改运行/调试配置的可执行路径

Puppeteer - 无法读取未定义的属性“可执行路径”

请将python.buildPython设置为您的Python可执行路径

Powershell 获取给定路径中的扩展文件

为什么 C# Process.Start 在我的路径上找不到可执行文件?

获取可执行文件的路径(使用std :: filesystem)

如何在Linux下以编程方式可靠地获取与具有给定pid的进程相对应的可执行路径?