将文件路径传递给Main(string [] args)不起作用

时间:2013-07-24 09:50:23

标签: c# console-application main filepath args

我正在尝试将文件路径传递给C# Console Application,但是当它到达控制台应用程序时,该字符串存在问题。

如果我从命令行运行我的应用程序,使用文件路径参数:

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

弹出一个Windows对话框并通知我我的应用程序已停止工作,当我单击Debug选项时,我可以看到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)从预构建事件调用我的应用程序,并且知道我可以通过其他方式获取当前解决方案的路径。但这是最简单的,我很好奇为什么它不能按预期工作。

4 个答案:

答案 0 :(得分:5)

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

\是转义字符,您可以使用它来转义引号(")。你必须逃避反斜杠,但只有当它在引用之前。所以使用(注意最后的'\\'):

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

或者,更简单,但你必须以某种方式在C#中处理它:

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

另见this question

答案 1 :(得分:1)

这就是为什么在路径中使用/总是更好

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

看看:http://en.wikipedia.org/wiki/Path_(computing),您可以在路径中同时使用\/,但如果您想要任何shell兼容性,我建议使用/

答案 2 :(得分: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\\"

(看看双斜线)

希望它有所帮助。

答案 3 :(得分:0)

继续Henk的回答,并选择在路径的末尾添加\,然后:

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

  1. args [0]只会被设置,即使你传递了多个参数.args的长度将等于1.所以你必须将args [0]分成多个部分供你的黑客使用。 / p>

  2. 如果"字符位于您分割的片段的末尾,则必须将\字符替换为function defaultValueDirective() { return { restrict: 'A', controller: [ '$scope', '$attrs', '$parse', function ($scope, $attrs, $parse) { var getter = $parse($attrs.ngModel); var setter = getter.assign; var value = getter(); if (value === undefined || value === null) { var defaultValueGetter = $parse($attrs.defaultValue); setter($scope, defaultValueGetter()); } } ] } }