如何从字符串中提取没有参数的文件路径?

时间:2013-08-26 23:12:25

标签: .net

我有一个包含可执行文件路径的字符串,该文件也可能包含或不包含命令行参数。

例如:

"C:\Foo\Bar.exe"
"C:\Foo\Bar.exe /test"
"C:\Foo\Bar.exe {0}"
"C:\Foo\Bar.exe -snafu"

我正在尝试将字符串分解为路径部分和参数部分。参数部分可以是几乎任何格式。但IO.Path函数假定字符串是没有争论的路径。例如,如果我打电话:

IO.Path.GetFileName(path)      

返回Bar.exe /testBar.exe {0}Bar.exe -snafu

当我在命令提示符下运行时,Windows显然可以区分,因此必须有一些方法来利用现有函数。

如果需要,我可以在引号中包围字符串的路径部分。但是IO.Path调用失败了。例如:

? IO.Path.GetFileName("""C:\Windows\write.exe"" {0}")

引发争议异常:路径中的非法字符。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

CommandLineToArgvW将是Sorceri提到的最佳方法(你可以看到example code here),但这里有一个天真的实现,可能就足够了。这假定文件扩展名始终存在。

string input = @"C:\Foo\Bar test\hello.exe {0}";
string[] split = input.Split(' ');

int index = 0;
string ext = String.Empty;
string path = "";
string arguments = "";

while (true)
{
    string testPath = String.Join(" ", split, 0, index);
    ext = Path.GetExtension(testPath);
    if (!String.IsNullOrEmpty(ext))
    {
        path = Path.GetFullPath(testPath);
        arguments = input.Replace(path, "").Trim();
        break;
    }

    index++;
}

Console.WriteLine(path + " " + arguments);

您可以添加处理,以便在未找到扩展名的情况下while循环不会永久运行。我只用你帖子中的三个网址测试了它,所以你可能想测试其他场景。