我搞砸了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类和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();
    }

最佳答案

正如评论中已经指出的,Files.isHidden的文档指出:


  隐藏的确切定义取决于平台或提供程序。 […]在Windows上,如果文件不是目录,并且设置了DOS hidden属性,则将其视为隐藏文件。


虽然最后引用的句子已经解释了,但是它没有返回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(…)

09-27 06:31