[英]How to check if a file/directory is a protected OS file?
我正在处理一个项目,该项目部分显示 JTable 目录中的所有文件,包括子目录。 用户可以双击子目录以使用该新目录的内容更新表。 但是,我遇到了一个问题。
我的文件列表是使用 file.listFiles() 生成的,它可以提取所有内容:隐藏文件、锁定文件、操作系统文件、整个套件和 caboodle,但我无法访问所有这些文件。 例如,我没有在“C:\\Users\\user\\Cookies\\”或“C:\\ProgramData\\ApplicationData\\”中读/写的权限。 不过没关系,这不是关于访问这些的问题。 相反,我不希望程序显示它无法打开的目录。 但是,我无权访问的目录和我访问的目录的行为几乎完全相同,这使得过滤它们变得非常困难。
我发现的唯一行为差异是,如果我在锁定目录上调用 listFiles(),它会返回 null。 这是我用作过滤器的代码块:
for(File file : folder.listFiles())
if(!(file.isDirectory() && file.listFiles() == null))
strings.add(file.getName());
其中“文件夹”是我正在查看的目录,“字符串”是该目录中文件的名称列表。 这个想法是一个文件只有在它是我被允许编辑的文件或目录时才会被加载到列表中。 过滤方面有效,但有一些目录包含数百个子目录,每个子目录包含数百个文件,并且由于 listFiles() 是 O(n),这不是一个可行的解决方案(list() 不是或者更好)。
但是,file.isHidden() 返回 false
canWrite()/canRead()/canExecute() 返回真
getPath() 返回与 getAbsolutePath() 和 getCanonicalPath() 相同
createNewFile() 对所有内容都返回 false,即使我知道的目录也可以。 另外,这是一个我真的很想避免的解决方案,即使它有效。
是否有一些我不知道的方法或实现可以帮助我查看该目录是否可以访问而无需解析其所有内容?
(我运行的是 Windows 7 Professional,我使用的是 Eclipse Mars 4.5.2,并且 File 的所有实例都是 java.io.File)。
您遇到的问题是您正在处理File
。 从各方面来看,在 2016 年,事实上,自 2011 年(Java 7 出现时)以来,它已被 JSR 203 取代。
现在,什么是 JSR 203? 它是一个全新的 API,可以处理任何文件系统和文件系统对象; 并且它扩展了“文件系统”的定义,以包括您在本地机器上找到的内容(JDK 所谓的“默认文件系统”)和您可能使用的其他文件系统。
关于如何使用它的示例页面:这里
这个 API 的众多优点之一是它可以访问您以前无法访问的元数据; 例如,您在评论中特别提到了您想知道 Windows 将哪些文件视为“系统文件”的情况。
你可以这样做:
// get the path
final Path path = Paths.get(...);
// get the attributes
final DosAttributes attrs = Files.readAttributes(path, DosFileAttributes.class);
// Is this file a "system file"?
final boolean isSystem = attrs.isSystem();
现在,什么是Paths.get()
? 如前所述,API 允许您一次访问多个文件系统; 一个名为FileSystems
的类可以访问 JDK 可见的所有文件系统(包括创建新文件系统),并且始终存在的默认文件系统由FileSystems.getDefault()
给出。
FileSystem
实例还允许您使用FileSystem#getPath
访问Path
。
结合这个,你会发现这两个是等价的:
Paths.get(a, b, ...)
FileSystems.getDefault().getPath(a, b, ...)
关于异常: File
处理它们非常糟糕。 举两个例子:
File#createNewFile
将返回 false;File
对象指向的目录的内容,则File#listFiles
将返回 null。JSR 203 没有这些缺点,甚至更多。 让我们采用两种等效的方法:
File#createNewFile
变成Files#createFile
;File#listFiles
成为Files#newDirectoryStream
(或派生类;参见 javadoc)或(自 Java 8 起) Files#list
。这些方法和其他方法在行为上有着根本的区别:在失败的情况下,它们会抛出异常。
更重要的是,您可以区分这是什么异常:
FileSystemException
或派生类,则错误在文件系统级别(例如,“访问被拒绝”是AccessDeniedException
);IOException
,那么问题就更基本了。 这个答案不能包含 JSR 203 的每一个用例; 这个 API 非常庞大,非常完整,虽然并非没有缺陷,但无论如何它都比File
提供的要好得多。
我在使用C://users/myuser/cookies
类的路径时遇到了同样的问题。
我已经使用过 JSR203,所以上面的答案对我没有帮助。 就我而言,这些文件的重要属性是隐藏的。
我最终使用了 FileSystemview,它根据需要排除了这些文件。
File[] files = FileSystemView.getFileSystemView().getFiles(new File(strHomeDirectory), !showHidden);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.