Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 命令行参数、带空格的路径、解析错误_C#_Command Line Arguments - Fatal编程技术网

C# 命令行参数、带空格的路径、解析错误

C# 命令行参数、带空格的路径、解析错误,c#,command-line-arguments,C#,Command Line Arguments,我有一个问题与这里所述的问题几乎相同(),但这个答案与我的处境无关 我收到的简单程序的参数是路径和path+文件名,其中可能有很多空格。发生的事情是,路径中的空间生成的参数比我实际拥有的要多得多。我通过传递args数组手动重建了所需的内容,但我今天发现,如果文件名有两个空格,我的方法将无法工作,我无法在程序中知道如何修复它 上传“\somesrv\Data\cust\9999\u Test4\Working\”\somesrv\Data\cust\9999\u Test4\Working\999

我有一个问题与这里所述的问题几乎相同(),但这个答案与我的处境无关

我收到的简单程序的参数是路径和path+文件名,其中可能有很多空格。发生的事情是,路径中的空间生成的参数比我实际拥有的要多得多。我通过传递args数组手动重建了所需的内容,但我今天发现,如果文件名有两个空格,我的方法将无法工作,我无法在程序中知道如何修复它

上传“\somesrv\Data\cust\9999\u Test4\Working\”\somesrv\Data\cust\9999\u Test4\Working\9999\u Test4-GUAST-买家列表PA 11 15 14\u 112514\u 101753 AM\u Sht=和stuff\u自动化\9999\u Test4-GUAST-买家列表PA 11 15 14\u 112514\u 101753 AM\u Sht=和stuff\u自动化.zip”

因此,对于这组参数,我得到了一个args[],包含21个元素。考虑到在某一点上有一对空格,我没有希望纠正这个问题

我能做些什么来确保这些途径得体地通过吗?在发送端或接收端都可以,因为我可以控制这两个端,但不能控制路径/文件名本身

代码:

static void Main(字符串[]args)
{
//args 0=开关值
//args 1=工作目录
//args 2=Mail.dat zip文件
如果(args.Length==0)
{
环境。退出(-1);
}
字符串maildatName=args[1]。子字符串(args[1]。IndexOf(“工作”)+8,args[1]。长度-(args[1]。IndexOf(“工作”)+8))+“”;
对于(int x=2;x
这是因为您在这里使用斜杠
工作\“
,当您添加另一个斜杠时,我相信它工作正常 所以,让它
…工作\“

编辑:我只是自己测试了一下,用一个双
\\
你可以得到3项:)


另请参见它是由第一个参数末尾的
\“
引起的

如果删除尾随斜杠或在引号前添加额外斜杠,则将得到两个参数。引号将被转义,并被视为第一个参数的一部分,直到它在2个字符后到达下一个引号。之后,您不再位于引号内,因此每个空格将导致另一个参数添加到
参数中
array

这是由于.Net使用
CommandLineToArgvW
来处理命令行参数及其用于处理字符转义的规则

乔恩·加洛韦对此有自己的看法

引述:

CommandLineToArgvW对后跟引号字符(“)的反斜杠字符有特殊的解释, 详情如下:

  • 2n个反斜杠后跟引号产生n个反斜杠后跟引号
  • (2n)+1个反斜杠后跟一个引号再次生成n个反斜杠后跟一个引号
  • n个不带引号的反斜杠只会产生n个反斜杠

尝试此操作,再次将参数加入字符串,然后在双引号字符上拆分该字符串

string parms = String.Join(" ", args);
string[] arguments = parms.Split('\"');
...

顺便说一句:这是一个解决约翰·科纳解释的问题的方法。

这似乎是一个使用正则表达式的好地方。啊!现在这让我感觉不那么疯狂了。谢谢你的详细信息和博客链接。我在麻烦路径的末尾用额外的\进行了测试,确实得到了我想要的结果。为了避免只需要在一个地方进行更改的问题,我实施了一个类似于jac建议的解决方案,但使用了更多的机制,希望将来能够证明。感谢附加链接。这无疑帮助我了解了正在发生的事情,以及今后如何避免这些麻烦。
string parms = String.Join(" ", args);
string[] arguments = parms.Split('\"');
...