在处理一些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。
答案 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:
确实