gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:40:30 24 4
gpt4 key购买 nike

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 函数。

没有公开SearchPath 的框架.NET 函数,但可以通过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());
}
}

关于C#:给定一个没有路径的文件时,如何获取 Process.Start 将使用的可执行路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33357893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com