将文件路径传递到Main(string[] args)中无法工作

4
我正在尝试将文件路径传递到一个 C# 控制台应用程序 中,但是在到达控制台应用程序之前,字符串不正确。
如果我从命令行运行我的应用程序,并带有文件路径参数:
MyApp "C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject\"

一个Windows对话框弹出,告诉我我的应用程序已停止工作,当我点击调试选项时,我可以看到args[0]的结果是:

C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject"

请注意,末尾仍有一个引号。

如果我传递第二个参数:

MyApp "C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject\" "any old string"

我再次遇到了错误,调试后发现args[0]的值为:

C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject" any

我对此感到困惑。我的猜测是字符串中的反斜杠导致了某种转义序列?编辑:我注意到在上面的字符串示例中也出现了同样的问题!似乎 \" 在这里会引起问题。

我只想传递当前解决方案目录的文件路径,并从预构建事件中使用$(SolutionDir)调用我的应用程序,并知道我可以通过其他方式获取当前解决方案的路径。但这是最简单的方法,我很好奇为什么它不能按预期工作。


我知道这不是直接的答案,但你可以通过 Directory.GetCurrentDirectory() 获取当前路径。 - Kamil Budziewski
@PhilipGullick @ 字符串在控制台中无法工作。 - xlecoustillier
#删除注释并隐藏。我不知道我当时在读什么... - Philip Gullick
4个回答

5

是的,命令行参数的规则有点模糊。

\ 是转义字符,您可以使用它来转义引号 (")。只有在反斜杠 ( \ ) 位于引号之前时,才需要对其进行转义。因此请使用以下语法 (请注意结尾处的 '\\' ):

MyApp "C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject\\" 

或者,更简单但您需要在C#中处理它:
MyApp "C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject" 

请参考这个问题

,它与IT技术有关。


你能试试这个吗? MyApp "C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject\ - Nisarg Shah
@NisargShah - 不确定你的意思,可能是你的格式混乱了。 \\ 在注释中也是特殊字符。 - H H
@HenkHolterman,我有点讨厌你,因为每次(好吧,不是每次,但经常)当我要发布答案时,你都比我先发了:) 我真的需要更多的stackoverflow练习。 - Dimitar Dimitrov
1
@DimitarDimitrov - 你可以在 Meta 上搜索“最快的枪”,你不是唯一有这个问题的人。 - H H

2
这就是为什么在路径中使用 / 总是更好的原因。
"C:/Users/DevDave/Documents/Visual Studio 2012/Projects/MyProject/" "any old string"

请看这个链接:http://en.wikipedia.org/wiki/Path_(computing) ,在路径中,您可以使用反斜杠(\)或正斜杠(/),但是如果您想要任何shell兼容性,建议使用正斜杠(/)。


1

MyApp之后的任何内容都将成为第一个参数(args [0])。在您的情况下,第一个参数是"C:\ Users \ DevDave \ Documents \ Visual Studio 2012 \ Projects \ MyProject\"。另外,字符串末尾的引号似乎是因为 \ " 意味着你想转义引号并将其作为字符串写入。 在这种情况下,引号没有关闭字符串。 这就是为什么args [0]是出现在MyApp之后的所有内容。

如果你不想转义引号并在其后面加上斜杠,你应该这样做 \\ "

你可以尝试这个并告诉我发生了什么:

MyApp "C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject\\"

(看双斜杠)

希望这有所帮助。


0

继Henk的回答之后,选择在路径末尾添加\

如果您选择通过选择Henk答案中的此代码(“更简单但您必须以某种方式在C#中处理它”)来解决错误,则应该意识到会发生一些错误:

  1. args[0]只会被设置,即使您传递多个参数。 args的长度将等于1。 因此,您必须将args [0]拆分成多个部分进行hack。

  2. 如果它们位于您拆分的部分的末尾,则必须用\替换任何"字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接