Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.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
Java Windows上路径分隔符不明确-如何处理?_Java_Windows_Path_Separator - Fatal编程技术网

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

Java Windows上路径分隔符不明确-如何处理?,java,windows,path,separator,Java,Windows,Path,Separator,提出了一个有趣的问题: 在Windows上,Java文件.pathSeparatorChar是,这是正确的。但是,分号实际上也是文件夹或文件名的有效字符。您可以创建名为Test的文件夹;Windows上的测试1 问题是:如果路径列表可以同时包含绝对路径和相对路径,那么如何确定路径列表中的分号实际上是分隔路径还是目录名的一部分?在Windows路径中,分号始终是分隔符。如果文件夹的名称中有分号,则可以将其简短的备用名称放在路径中。要查找短名称,请使用DIR/X。例如: C:\> dir te

提出了一个有趣的问题:

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


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

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

C:\> dir test* /X
<DIR>   **TEST_T~1**     Test;Test1
C:\> set PATH=TEST_T~1;%PATH%
C:\>dir-test*/X
**试验1**试验;测试1
C:\>设置路径=测试\u T~1;%路径%

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

跟踪小型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


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

因为这个问题是针对Java的,并且基于@SubOptimal解释了带分号的路径应该用引号括起来,这里有一个小代码示例来提取pat从这样一个列表中选择hs,用
File.pathseptor
分隔:

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);
    }
}
String separatedList=“\”测试;测试1\”;c:\\windows\“测试2\”;测试3;;测试4”;
字符串模式=String.format(“(?:(?:\”([^\“]*)\”)\”);([^%1$s]+)%1$s?”,File.pathSeparator);
Pattern p=Pattern.compile(Pattern);
匹配器m=p.Matcher(分离列表);
while(m.find())
{

对于(int i=1;i虽然我可以这样做,但它确实违背了允许长路径名的初衷,不是吗?问题不在于名称的长度,而是它包含路径分隔符。如果您希望
path
将文件夹解释为文件夹,您需要使用不包含分隔符的表单。啊哈!现在我们不需要了你是说
where dummy
?@stvcisco如果你是说Unix工具
which
它应该是
which dummy.cmd
,但是没有找到。因为
where dummy.cmd
它也没有找到文件,我不会责怪它e
which
。-)虽然这看起来确实有效,而且(大概)是解析此类路径的正确方法,但我强烈建议不要在生产系统的路径中添加包含分号的目录名。