为什么Files.isHidden()无法正常工作?

时间:2016-06-11 04:27:08

标签: java io nio

我搞乱了Java NIO,由于某种原因,我无法让Files.isHidden()返回正确的布尔值。该程序只是检查目录是否被隐藏,然后如果它被隐藏将使其可见,如果它不被隐藏,它将使其隐藏。这就是我所拥有的:

    Path start = FileSystems.getDefault().getPath("E:/Documents/someDirectory");
    try {
        if (Files.isHidden(start)){
            System.out.println("Dir is hidden.");
            Files.setAttribute(start, "dos:hidden", false);
        } else {
            System.out.println("Dir is not hidden. Hiding.");
            Files.setAttribute(start, "dos:hidden", true);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

尽管目录被隐藏,它仍然会返回false并隐藏目录。以下代码使用旧的File类w / Path类。

    Path start = FileSystems.getDefault().getPath("E:/Documents/someDirectory");
    File file = new File("E:/Documents/someDirectory");
    try {
        if (file.isHidden()){
            System.out.println("Dir is hidden.");
            Files.setAttribute(start, "dos:hidden", false);
        } else {
            System.out.println("Dir is not hidden. Hiding.");
            Files.setAttribute(start, "dos:hidden", true);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

1 个答案:

答案 0 :(得分:1)

正如评论中已经指出的那样,Files.isHidden州的文件:

  

隐藏的确切定义是平台或提供者依赖。 [...]在Windows上,如果文件不是目录并且设置了DOS隐藏属性,则该文件被视为隐藏。

虽然最后引用的句子已经解释了虽然它没有返回Windows上目录的预期值,但我想强调第一句话。您正在使用负载平台/提供程序特定语义的方法,而您只想切换特定的,特定于平台的标记。

在这种情况下,你应该做到这一点,这也忽略了代码的条件:

Path start=Paths.get("E:/Documents/someDirectory");
boolean isHidden=(Boolean)Files.getAttribute(start, "dos:hidden");
System.out.println("Dir is "+(isHidden? "hidden. Showing.": "not hidden. Hiding"));
Files.setAttribute(start, "dos:hidden", !isHidden);

还请注意Paths.get(…)的便捷方法FileSystems.getDefault().getPath(…)