isDirectory()为文件返回true

时间:2011-07-14 07:40:31

标签: java file directory java-io

在我的java程序中,我复制一个文件并删除新文件。

在我的方法removeFile()中,我检查它是否是一个目录:

String fileName = "G:/1310628353186Examples.csv";
File f = new File(fileName);
if (f.isDirectory()) {
    System.out.println( "'" + fileName + "' is a directory" );
    String[] files = f.list();
    if (files != null && files.length > 0)
        throw new IllegalArgumentException("Delete: directory not empty: " + fileName);
}

有时候我会"'G:/1310628353186Examples.csv' is a directory",有时我不会。{/ p>

当我调试代码并且f.isDirectory()true并检查f.isDirectory中的内容时,调试器会说它是false

我在Windows 7 Professional上运行Eclipse SDK 3.4.0和JDK 1.6。

6 个答案:

答案 0 :(得分:8)

您检查f是否是目录,但是您打印fileName。那么也许你只是检查/打印错误的变量?除非你的问题只是一个错字。

答案 1 :(得分:2)

尝试添加检查以查看文件是否存在,如果文件不存在,isDirectory()也将返回false:

if (f.exists() && f.isDirectory()) {

答案 2 :(得分:2)

如果文件被隐藏,例如 Documents 中的我的音乐链接(一个Windows生成的快捷方式文件,它不是真正的快捷方式),那么它将测试为isdirectory但它不会像目录一样运行;你无法获得该目录的列表。用户生成的快捷方式将像文件一样。

13年5月31日: 在最近的更新中,'Documents'中的'My Music'链接不再测试为is_hidden。但是,对“我的音乐”文件对象采用的转义符会返回NULL,可以对其进行测试。

答案 3 :(得分:2)

我在OSX上遇到同样的问题。我创建了一个常规文件,isDirectory()函数返回trueisFile()返回false。 (无法在任何地方找到任何证据表明API会出现这种行为)。

我在OSX上解决它的方法是手动从文件中读取属性,但是你也不能使用BasicFileAttributes - 它也因某种原因返回true isDirectory() {}}和false isRegularFile()

适用于OSX:

PosixFileAttributes attr = Files.readAttributes(f.toPath(), PosixFileAttributes.class);

System.out.println("File "+f.getName()+
                   ": isDirectory="+(attr.isDirectory() ? "true" : "false")+
                   ", isRegularFile="+(attr.isRegularFile() ? "true" : "false"));

答案 4 :(得分:1)

您必须使用try / catch块进行环绕,然后尝试。

答案 5 :(得分:1)

这似乎是由Windows引起的问题。 Linux没有这个问题。