如何在C#中适配不同平台的可执行文件扩展名?
跨平台适配可执行文件搜索的解决方案
我有一个搜索可执行文件的函数,不同操作系统的差异导致行为不一致:在Ubuntu系统中,执行which cat会返回/usr/bin/cat;在Windows系统中,执行where cat会返回C:\msys64\usr\bin\cat.exe。当前代码调用Exists("cat")时固定添加.exe后缀,导致Linux平台下无法正确匹配无后缀的可执行文件,代码如下:
static bool Exists(string fileName) { return GetFullPath(fileName) != null; } static string? GetFullPath(string fileName) { if (File.Exists(fileName)) { return Path.GetFullPath(fileName); } var values = Environment.GetEnvironmentVariable("PATH"); if ( values is null) { return null; } foreach (var path in values.Split(Path.PathSeparator)) { var fullPath = Path.Combine(path, fileName) + ".exe"; if (File.Exists(fullPath)) { return fullPath; } } return null; }
要修改var fullPath = Path.Combine(path, fileName) + ".exe";这一行实现跨平台适配,核心是根据当前操作系统动态决定是否添加.exe后缀,以下是几种可行方案:
方案一:使用.NET 6+原生API(推荐)
利用OperatingSystem.IsWindows()直接判断系统类型,代码简洁直观:var fullPath = Path.Combine(path, fileName) + (OperatingSystem.IsWindows() ? ".exe" : string.Empty);方案二:兼容旧版.NET框架
针对.NET 6之前的版本,使用Environment.OSVersion.Platform判断:var fullPath = Path.Combine(path, fileName) + (Environment.OSVersion.Platform == PlatformID.Win32NT ? ".exe" : string.Empty);进阶优化:避免重复添加后缀
如果传入的fileName本身已经带有后缀(比如用户传入cat.exe),无需重复添加,可以增加判断逻辑:var needAddExe = OperatingSystem.IsWindows() && string.IsNullOrEmpty(Path.GetExtension(fileName)); var fullPath = Path.Combine(path, fileName) + (needAddExe ? ".exe" : string.Empty);
内容的提问来源于stack exchange,提问作者Gerhard
相关产品推荐
相关产品推荐

