2

我认为最好先说明情况。

情况

我正在编写一些过滤 a Setof Files 的软件。

过滤器如下:如果文件未隐藏,则将其添加到新的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:\ 驱动器本身是隐藏的!

我能做些什么呢?

4

2 回答 2

1

我的猜测是您的 while 条件需要&&运算符而不是||(它可能导致一些 NPE)。
尝试:

while (!hidden && (parentFile != null)) {...
于 2012-08-08T10:26:45.323 回答
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;
}

感谢所有插话的人...

于 2012-08-08T11:49:20.317 回答