Java Windows上路径分隔符不明确-如何处理?
提出了一个有趣的问题: 在Windows上,JavaJava Windows上路径分隔符不明确-如何处理?,java,windows,path,separator,Java,Windows,Path,Separator,提出了一个有趣的问题: 在Windows上,Java文件.pathSeparatorChar是,这是正确的。但是,分号实际上也是文件夹或文件名的有效字符。您可以创建名为Test的文件夹;Windows上的测试1 问题是:如果路径列表可以同时包含绝对路径和相对路径,那么如何确定路径列表中的分号实际上是分隔路径还是目录名的一部分?在Windows路径中,分号始终是分隔符。如果文件夹的名称中有分号,则可以将其简短的备用名称放在路径中。要查找短名称,请使用DIR/X。例如: C:\> dir te
文件.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
它也没有找到文件,我不会责怪它ewhich
。-)虽然这看起来确实有效,而且(大概)是解析此类路径的正确方法,但我强烈建议不要在生产系统的路径中添加包含分号的目录名。