我搞砸了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(…)
。