路径末尾的Java两个点有意想不到的结果

时间:2013-11-07 07:14:21

标签: java windows

在处理一些File对象时,我遇到了我认为不寻常的行为。

import java.io.File;

public class MyClass
{
    public static void main(String[] args)
    {
        File file = new File("C:\\x..");

        System.out.println(file.isDirectory());

        System.out.println(file.listFiles());
    }
}

假设某个目录C:\x存在,file.isDirectory()将返回true,并在路径末尾添加两个点。这会复制命令行中的行为,cd x..会将目录更改为x

但是,在调用file.listFiles()时,该方法返回null,只有在文件不是目录时才会发生。这似乎与listFiles()的定义不一致。

为什么会这样?为什么在路径末端有两个点会转到同一个目录,好像没有点?

这个问题似乎是Windows独有的。 Linux正确(?)为isDirectory()返回false。

2 个答案:

答案 0 :(得分:4)

Windows修剪路径和文件名中的尾随点。我无法找到具体的参考资料,只是其中一种神秘的东西,一直都是这样。

它修剪了完整路径名的尾随点,而不是单个组件。

因此,虽然“C:\ x ....”与“C:\ x”相同,但“C:\ x .... \ filename”与“C:\ x \”不同filename“,因为后者没有尾随点。

您必须在Windows上查看JDK的本机FileSystem源,以准确了解它是如何获取文件列表的,但我怀疑它正在进行某种搜索,例如: “C:\ x .. \ *。*”使用Windows“FindFirstFile API调用或其他内容,其中的点不再是尾随。换句话说,假设“C:\ x”是一个目录,而路径“C:\ x ..”是一个目录,“C:\ x .. \ *。*”不匹配,而“C:\ x .. \子目录“不映射到”C:\ x \子目录“。

您应该避免使用此类路径。我不确定你是如何获得该路径字符串的。

您可以使用File.getCanonicalPath()File.getCanonicalFile()将其转换回更有用的路径名。

顺便说一下,如果你想对Windows有一些乐趣,在命令提示符下键入以下内容(假设“c:\ windows \ temp”存在,否则替换为其他路径):

echo > \\?\c:\windows\temp\x.

Windows中的\\?\前缀禁用文件名处理和扩展。现在删除生成的文件。也可以在资源管理器中试用它。

扰流:

  

您必须使用控制台中的通配符将其删除,例如del x?

答案 1 :(得分:-1)

您忘记在..之前添加额外的斜杠,它应该是c:\\x\\..。这将指向C:确实