【问题标题】:Ambiguous path separator on Windows - how to handle it?Windows 上不明确的路径分隔符 - 如何处理?
【发布时间】:2015-06-19 20:32:00
【问题描述】:

Another question 提出了一个有趣的问题:

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

问题是:如果路径列表可以包含绝对路径和相对路径,您如何确定路径列表中的分号是实际分隔路径还是目录名称的一部分?

【问题讨论】:

    标签: java windows path separator


    【解决方案1】:

    在 Windows PATH 中,分号始终是分隔符。如果您有一个名称中带有分号的文件夹,您可以将其简短的备用名称放在PATH 中。要查找短名称,请使用 DIR /X。例如:

    C:\> dir test* /X
    <DIR>   **TEST_T~1**     Test;Test1
    C:\> set PATH=TEST_T~1;%PATH%
    

    【讨论】:

    • 虽然我可以这样做,但它确实违背了首先允许长路径名的目的,不是吗?
    • 问题不在于名称的长度,而在于它包含路径分隔符。如果您希望 PATH 将您的文件夹解释为文件夹,您需要使用不包含分隔符的表单。
    【解决方案2】:

    如果路径本身包含;,则路径必须用双引号括起来"

    跟随小PoC

    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 已通过路径设置找到。

    edit 从 cmets 中可以看出:使用分号可能会给您带来一些麻烦。最好避免使用包含分号的目录名。

    【讨论】:

    • 啊哈!现在我们正在谈论。这似乎是合理的。
    • 有趣,这行得通,但是当我尝试which dummy 时没有找到它。
    • 你的意思是where dummy
    • @stvcisco 如果您指的是 Unix 工具 which,它应该是 which dummy.cmd。但它没有找到。作为where dummy.cmd,它也没有找到文件,我不会为此责备which。 ;-)
    • 虽然这看起来确实有效,并且(可能)是解析此类 PATH 的正确方法,但我强烈建议不要在生产系统上将包含分号的目录名称添加到 PATH。
    【解决方案3】:

    由于问题是针对 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);
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-07
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 2011-02-25
      相关资源
      最近更新 更多