Java认为C:\驱动器是隐藏的吗?

时间:2012-08-08 10:06:49

标签: java file undefined-behavior

我认为如果我先解释一下情况会更好。

情况

我正在撰写一些过滤Set File个{s}的软件。

过滤器如下:如果文件未隐藏,则将其添加到新Set

问题是File.isHidden()的当前行为如下:

File f = new File("C:\Documents and Settings\Administrator\Local Settings\Temp\REG28E.tmp");
System.out.println(f.isHidden());

该程序将输出false

文件本身(REG28E.tmp)实际上并未隐藏。而是隐藏了路径中的某个文件夹Local Settings)。

我想创建一些代码来检查:

如果隐藏了文件路径的某处,则该文件被标记为隐藏。

我想出了以下解决方案来递归检查文件的路径:

boolean hidden = file.isHidden();
File parentFile = file.getParentFile();
while ((hidden == false) || (parentFile != null)) {
    hidden = parentFile.isHidden();
    parentFile = parentFile.getParentFile();
}

if (!hidden) {
    acceptedFileList.add(file);
}

问题

最后,我们来解决问题。我永远无法进入我实际添加文件的阶段。问题是Java认为隐藏了C:\ drive 本身

我该怎么做?

2 个答案:

答案 0 :(得分:1)

我的猜测是你的状态需要&&运算符而不是||(它可能会导致一些NPE)。
尝试:

while (!hidden && (parentFile != null)) {...

答案 1 :(得分:1)

解决方案涉及添加手动检查以查看parentFile对象是否是根目录。

while ((hidden == false) && (parentFile != null)) {
    // added the IF statement below:
    if (FileSystemUtils.isRoot(parentFile)) {
        hidden = false;
        break;
    }

    hidden = parentFile.isHidden();
    parentFile = parentFile.getParentFile();
}


检查根目录

上面的代码使用了FileSystemUtils类。它包含以下方法:

public static boolean isRoot(File file) {
    File[] roots = File.listRoots();

    for (File root : roots) {
        if (file.equals(root)) {
        return true;
        }
    }

    return false;
}

感谢所有插话的人......