C# 如何获取文件的完整路径?

C# 如何获取文件的完整路径?,c#,C#,我尝试获取文件的完整路径。即calc Input: calc Expected output: C:\WINDOWS\system32\calc.exe 我可以找到如何使用PowerShell执行此操作: (Get-Command calc).Source 或使用命令行: where.exe calc 但不幸的是,我不能用C完成这件事。我也不知道用C做这件事的方法。但是,路径通常是众所周知的,可以通过以下方式检索: 当时我不仅仅使用System(37),就像我在x32/x86系统还很流

我尝试获取文件的完整路径。即
calc

Input:  calc
Expected output:  C:\WINDOWS\system32\calc.exe
我可以找到如何使用PowerShell执行此操作:

(Get-Command calc).Source
或使用命令行:

where.exe calc

但不幸的是,我不能用C完成这件事。

我也不知道用C做这件事的方法。但是,路径通常是众所周知的,可以通过以下方式检索:

当时我不仅仅使用System(37),就像我在x32/x86系统还很流行的时候写的那样。你需要检查它现在是如何解决的

请注意,这些路径中的大多数在PATH系统变量中是重复的,因此您可以查找:


路径变量又回到了以前的DOS时代。基本上,如果给命令行一个命令/文件名,它将尝试内置命令,然后在当前工作目录(.bat、.com、.exe)中查找可执行文件,然后再查看路径目录以再次查找可执行文件。只有当所有这些都失败了,它才会抱怨。

我也不知道从C#那里有什么方法可以做到这一点。但是,路径通常是众所周知的,可以通过以下方式检索:

当时我不仅仅使用System(37),就像我在x32/x86系统还很流行的时候写的那样。你需要检查它现在是如何解决的

请注意,这些路径中的大多数在PATH系统变量中是重复的,因此您可以查找:


路径变量又回到了以前的DOS时代。基本上,如果给命令行一个命令/文件名,它将尝试内置命令,然后在当前工作目录(.bat、.com、.exe)中查找可执行文件,然后再查看路径目录以再次查找可执行文件。只有当所有这些都失败了,它才会抱怨。

您可以获得
路径
环境变量,用
拆分它
作为分隔符并循环该结果。然后,检查文件
path+@“\”+name+.exe”
是否存在

var findMe = "calc";
var pathes = Environment.GetEnvironmentVariable("Path").Split(';');
foreach (var path in pathes)
{
     var testMe = $@"{path}\{findMe}.exe";
    if (File.Exists(testMe))
    {
         Console.WriteLine(testMe);
    }
}
这将产生:

C:\WINDOWS\system32\calc.exe


您可以获取
路径
环境变量,用
将其拆分
作为分隔符并循环该结果。然后,检查文件
path+@“\”+name+.exe”
是否存在

var findMe = "calc";
var pathes = Environment.GetEnvironmentVariable("Path").Split(';');
foreach (var path in pathes)
{
     var testMe = $@"{path}\{findMe}.exe";
    if (File.Exists(testMe))
    {
         Console.WriteLine(testMe);
    }
}
这将产生:

C:\WINDOWS\system32\calc.exe

报告说:

Get Command*获取所有类型的命令,包括Path环境变量($env:Path)中的所有非PowerShell文件,该变量在应用程序命令类型中列出

因此,我们需要获取
Path
环境变量并遍历它列出的目录,查找扩展名指示文件是程序的文件,例如“*.com”和“*.exe”

Path环境变量的问题是,它可能会被不存在的目录污染,因此我们必须检查这些目录

文件名和扩展名的大小写无关紧要,因此需要进行不区分大小写的比较

static void ShowPath(string progName)
{
    var extensions = new List<string> { ".com", ".exe" };
    string envPath = Environment.GetEnvironmentVariable("Path");
    var dirs = envPath.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

    foreach (string d in dirs.Where(f => Directory.Exists(f)))
    {
        foreach (var f in (Directory.EnumerateFiles(d).
            Where(thisFile => extensions.Any(h => Path.GetExtension(thisFile).Equals(h, StringComparison.InvariantCultureIgnoreCase)))))
        {
            if (Path.GetFileNameWithoutExtension(f).Equals(progName, StringComparison.InvariantCultureIgnoreCase))
            {
                Console.WriteLine(f);
                return;
            }
        }
    }

    Console.WriteLine("Not found.");
}

static void Main(string[] args)
{
    ShowPath("calc");

    Console.ReadLine();
}
静态无效显示路径(字符串progName)
{
var extensions=新列表{.com',.exe};
字符串envPath=Environment.GetEnvironmentVariable(“路径”);
var dirs=envPath.Split(新字符[]{';'},StringSplitOptions.RemoveEmptyEntries);
foreach(dirs.Where(f=>Directory.Exists(f))中的字符串d)
{
foreach(varf)在(Directory.enumerated)文件中。
其中(thisFile=>extensions.Any(h=>Path.GetExtension(thisFile).Equals(h,StringComparison.InvariantCultureIgnoreCase()()))
{
if(Path.GetFileNameWithoutExtension(f).Equals(progName,StringComparison.InvariantCultureIgnoreCase))
{
控制台写入线(f);
返回;
}
}
}
Console.WriteLine(“未找到”);
}
静态void Main(字符串[]参数)
{
显示路径(“计算”);
Console.ReadLine();
}
输出:

C:\WINDOWS\system32\calc.exe

当前用户总是有可能没有权限列出路径中某个位置的文件,因此应为此添加检查。此外,您可能希望使用
StringComparison.CurrentCultureInoRecase
进行比较。

说明:

Get Command*获取所有类型的命令,包括Path环境变量($env:Path)中的所有非PowerShell文件,该变量在应用程序命令类型中列出

因此,我们需要获取
Path
环境变量并遍历它列出的目录,查找扩展名指示文件是程序的文件,例如“*.com”和“*.exe”

Path环境变量的问题是,它可能会被不存在的目录污染,因此我们必须检查这些目录

文件名和扩展名的大小写无关紧要,因此需要进行不区分大小写的比较

static void ShowPath(string progName)
{
    var extensions = new List<string> { ".com", ".exe" };
    string envPath = Environment.GetEnvironmentVariable("Path");
    var dirs = envPath.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

    foreach (string d in dirs.Where(f => Directory.Exists(f)))
    {
        foreach (var f in (Directory.EnumerateFiles(d).
            Where(thisFile => extensions.Any(h => Path.GetExtension(thisFile).Equals(h, StringComparison.InvariantCultureIgnoreCase)))))
        {
            if (Path.GetFileNameWithoutExtension(f).Equals(progName, StringComparison.InvariantCultureIgnoreCase))
            {
                Console.WriteLine(f);
                return;
            }
        }
    }

    Console.WriteLine("Not found.");
}

static void Main(string[] args)
{
    ShowPath("calc");

    Console.ReadLine();
}
静态无效显示路径(字符串progName)
{
var extensions=新列表{.com',.exe};
字符串envPath=Environment.GetEnvironmentVariable(“路径”);
var dirs=envPath.Split(新字符[]{';'},StringSplitOptions.RemoveEmptyEntries);
foreach(dirs.Where(f=>Directory.Exists(f))中的字符串d)
{
foreach(varf)在(Directory.enumerated)文件中。
其中(thisFile=>extensions.Any(h=>Path.GetExtension(thisFile).Equals(h,StringComparison.InvariantCultureIgnoreCase()()))
{
if(Path.GetFileNameWithoutExtension(f).Equals(progName,StringComparison.InvariantCultureIgnoreCase))
{
控制台写入线(f);
返回;
}
}
}
Console.WriteLine(“未找到”);
}
静态void Main(字符串[]参数)
{
显示路径(“计算”);
Console.ReadLine();
}
输出:

C:\WINDOWS\system32\calc.exe

当前用户总是有可能没有权限列出路径中某个位置的文件,因此应为此添加检查。此外,您可能需要使用
StringComparison.CurrentCultureIg