Windows上的路径分隔符不明确 - 如何处理?

6

另一个问题提出了一个有趣的问题:

在Windows上,Java File.pathSeparatorChar;,这是正确的。然而,分号也是文件夹或文件名的有效字符。你可以在Windows上创建一个名为Test;Test1的文件夹。

问题是:如果路径列表既包含绝对路径又包含相对路径,如何确定路径中的分号实际上是路径的分隔符还是目录名的一部分?

3个回答

5
如果路径本身包含一个分号;,则路径必须用双引号"括起来。
以下是一个小的演示示例。
mkdir "foo;bar"
echo echo execute %%~dpnx0 > "foo;bar\dummy.cmd"
set PATH=%PATH%;"foo;bar"
dummy.cmd

输出结果将为:
execute R:\temp\foo;bar\dummy.cmd

意味着路径设置找到了dummy.cmd

编辑 从评论中可以看出:使用分号可能会导致一些麻烦。最好避免使用包含分号的目录名。


啊哈!现在我们可以谈论了。这似乎是合理的。 - Thorsten Dittmar
有意思,这个可行,但是当我尝试输入“which dummy”时,它没有找到它。 - Always Learning
你是指 where dummy 吗? - Thorsten Dittmar
@stvcisco 如果你指的是Unix工具“which”,那么应该使用“which dummy.cmd”。但是它未被找到。由于“where dummy.cmd”也无法找到该文件,我不会怪罪“which”。;-) - SubOptimal
1
虽然这似乎可以工作,并且(大概)是解析此类路径的正确方法,但我强烈建议不要在生产系统上将包含分号的目录名称添加到PATH中。 - Harry Johnston
显示剩余2条评论

1

由于问题是关于Java的,基于@SubOptimal answer 的解释,说明带有分号的路径应该用引号括起来,下面是一个小代码示例,用于从这样的列表中提取由File.pathSeparator分隔的路径:

String separatedList  = "\"test;test1\";c:\\windows;\"test2\";test3;;test4";

String pattern = String.format("(?:(?:\"([^\"]*)\")|([^%1$s]+))%1$s?", File.pathSeparator);
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(separatedList);
while (m.find())
{
    for (int i = 1; i <= m.groupCount(); i++)
    {
        String path = m.group(i);
        if (path != null)
            System.out.println(path);
    }
}

作为参考,不带转义字符的正则表达式是(?:(?:"([^"]*)")|([^;]+));?


0
在Windows的PATH中,分号始终是一个分隔符。如果您有一个名称中带有分号的文件夹,可以将其短替代名称放入PATH中。要查找短名称,请使用DIR /X命令。例如:
C:\> dir test* /X
<DIR>   **TEST_T~1**     Test;Test1
C:\> set PATH=TEST_T~1;%PATH%

虽然我可以这样做,但这真的违背了允许长路径名的初衷,不是吗? - Thorsten Dittmar
问题不在于名称的长度,而在于它包含路径分隔符。如果您希望PATH将您的文件夹解释为文件夹,则需要使用不包含分隔符的形式。 - Always Learning

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