代码之家  ›  专栏  ›  技术社区  ›  MeesterMarcus

为什么不文件。Hidden()工作正常吗?

  •  1
  • MeesterMarcus  · 技术社区  · 9 年前

    我正在使用Java NIO,由于某些原因,我无法获取文件。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();
        }
    
    1 回复  |  直到 9 年前
        1
  •  2
  •   Holger    9 年前

    正如评论中已经指出的 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(…) .