C# 在C中模拟Linux的哪个命令#
我在一个名为C# 在C中模拟Linux的哪个命令#,c#,C#,我在一个名为GraphViz的C项目中使用了一个工具的二进制文件。 问题是我必须将二进制文件路径作为硬编码包含在内,我不想这样做 IRenderer renderer = new Renderer("C:\\Program Files (x86)\\Graphviz2.38\\bin"); // todo: remove hardcoded GraphViz path 我想模拟linux的which命令。 只需传递二进制名称(例如dot)并获取路径 GetBinaryPath("dot");
GraphViz
的C项目中使用了一个工具的二进制文件。
问题是我必须将二进制文件路径作为硬编码包含在内,我不想这样做
IRenderer renderer = new Renderer("C:\\Program Files (x86)\\Graphviz2.38\\bin"); // todo: remove hardcoded GraphViz path
我想模拟linux的which
命令。
只需传递二进制名称(例如dot
)并获取路径
GetBinaryPath("dot"); // return the above path
如果有任何想法或主题可以开始搜索,我将不胜感激
注
目标操作系统:Windows.NET版本:4如果只需要查找给定可执行文件名的路径(并且安装目录位于
path
环境变量中)
备选案文1:
将where
命令与Process
类一起使用。(测试退出代码,解析输出)
备选案文2:
您可以获取环境路径环境变量,将其拆分为“;”并测试您的可执行文件名是否存在。首先,您需要找到windows在其中搜索可执行文件的所有目录,这些文件来自环境变量%PATH%。 然后您需要从%PATHEXT%查找所有扩展名(.com、.exe、.bat等) 然后你只需像这样检查它们:
internal class Program {
private static void Main(string[] args) {
if (args.Length != 1) {
Console.WriteLine("Incorrect usage!");
return;
}
var extensions = GetExecutableExtensions(args[0]);
var paths = GetPaths();
var exeFile = GetFirstExecutableFile(args[0], extensions, paths);
if (exeFile == null) {
Console.WriteLine("No file found!");
}
else {
Console.WriteLine(exeFile);
}
}
private static string GetFirstExecutableFile(string file, string[] extensions, string[] paths) {
foreach (var path in paths) {
var filename = Path.Combine(path, file);
if (extensions.Length == 0) {
if (File.Exists(filename)) {
return filename;
}
}
else {
foreach (var ext in extensions) {
filename = Path.Combine(path, file + ext);
if (File.Exists(filename)) {
return filename;
}
}
}
}
return null;
}
private static string[] GetExecutableExtensions(string file) {
var data = GetCmdOutput("echo %PATHEXT%");
var arr = data.TrimEnd('\n', '\r').Split(new [] {';'}, StringSplitOptions.RemoveEmptyEntries);
//If the command passed in ends with a executable extension then we dont need to test all extensions so set it to emtpy array
foreach (var ext in arr) {
if (file.EndsWith(ext, StringComparison.OrdinalIgnoreCase)) {
return new string[0];
}
}
return arr;
}
private static string[] GetPaths() {
var data = GetCmdOutput("echo %PATH%");
return data.TrimEnd('\n', '\r').Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
}
private static string GetCmdOutput(string cmd) {
using (var proc = new Process {
StartInfo = new ProcessStartInfo {
FileName = "cmd.exe",
Arguments = "/c " + cmd,
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
}
}) {
proc.Start();
return proc.StandardOutput.ReadToEnd();
}
}
}
为什么不用旗子?还是菜单项?或一个环境变量,用于指定程序的安装位置,或仅确保二进制文件位于PATH变量中,并使用exec而不指定目录(这是
哪个
所做的)2票结束问题,我不明白这与编程无关。Graphviz2.38
部分是否已修复?如果是这样,您可以通过Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)获取C:\\ProgramFiles(x86)
另外,Windows也有一个类似的命令行工具,它被称为where
,关于为什么这是一个不可靠的问题:刚刚注意到Skomialek的答案中的“where”命令。更好的解决方案。至少你从我的代码中知道它是如何工作的。。。