Java 如何检查文件/目录是否为受保护的OS文件?
我正在做一个项目,在某种程度上,它显示JTable中一个目录中的所有文件,包括子目录。用户可以双击子目录以使用新目录的内容更新表。然而,我遇到了一个问题 我的文件列表是使用file.listFiles()生成的,它会调出所有内容:隐藏文件、锁定文件、操作系统文件、整个工具包和堆,而我无法访问所有这些文件。例如,我没有权限在“C:\Users\user\Cookies\”或“C:\ProgramData\ApplicationData\”中读/写。不过没关系,这不是关于访问这些的问题。相反,我不希望程序显示一个无法打开的目录。但是,我无法访问的目录和我访问的目录的行为几乎完全相同,这使得很难将它们过滤掉 我发现的唯一不同之处是,如果在锁定的目录上调用listFiles(),它将返回null。 下面是我用作过滤器的代码块:Java 如何检查文件/目录是否为受保护的OS文件?,java,file,Java,File,我正在做一个项目,在某种程度上,它显示JTable中一个目录中的所有文件,包括子目录。用户可以双击子目录以使用新目录的内容更新表。然而,我遇到了一个问题 我的文件列表是使用file.listFiles()生成的,它会调出所有内容:隐藏文件、锁定文件、操作系统文件、整个工具包和堆,而我无法访问所有这些文件。例如,我没有权限在“C:\Users\user\Cookies\”或“C:\ProgramData\ApplicationData\”中读/写。不过没关系,这不是关于访问这些的问题。相反,我不希
for(File file : folder.listFiles())
if(!(file.isDirectory() && file.listFiles() == null))
strings.add(file.getName());
其中“folder”是我正在查找的目录,“strings”是该目录中文件名的列表。其思想是,只有当文件或目录是允许我编辑的时,才会将其加载到列表中。过滤方面可以工作,但有些目录包含数百个子目录,每个子目录包含数百个以上的文件,并且由于listFiles()是O(n),这不是一个可行的解决方案(list()也不是更好)
但是,,
file.ishiden()返回false
canWrite()/canRead()/canExecute()返回true
getPath()返回与getAbsolutePath()和getCanonicalPath()相同的值
createNewFile()对所有内容返回false,即使我知道的目录也可以。另外,这是一个我真的很想避免的解决方案,即使它有效
是否有一些我不知道的方法或实现可以帮助我查看这个目录是否可以访问,而不需要解析它的所有内容
(我运行的是Windows7Professional,我使用的是EclipseMars4.5.2,文件的所有实例都是java.io.File) 您遇到的问题是您正在处理
文件
。所有人都认为,在2016年,事实上,自2011年(Java7问世)以来,它已经被JSR203所取代
现在,什么是JSR203?它是一个全新的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();
现在,什么是路径。get()?如前所述,API允许您一次访问多个文件系统;名为的类允许访问JDK可见的所有文件系统(包括创建新的文件系统),默认文件系统(始终存在)由
filesystems.getDefault()
提供
文件系统
实例还允许您使用访问路径
结合这一点,你会发现这两者是等价的:
Paths.get(a, b, ...)
FileSystems.getDefault().getPath(a, b, ...)
关于异常:
文件
处理异常非常糟糕。仅举两个例子:
- 如果无法创建文件,
将返回false李>File#createNewFile
- 如果由于任何原因无法读取
对象指向的目录内容,则文件
将返回null文件#列表文件
变成李>File#createNewFile
变为(或派生;参见javadoc)或(自Java8以来)File#listFiles
- 如果是或派生的,则错误在文件系统级别(例如,“拒绝访问”是一个
)李>AccessDeniedException
- 如果是
,则问题更为根本IOException
这个答案不能包含JSR203的每个用例;这个API非常庞大,非常完整,虽然不是没有缺陷,但它在任何情况下都比
文件
提供的要好得多。您遇到的问题是您正在处理文件
。所有人都认为,在2016年,事实上,自2011年(Java7问世)以来,它已经被JSR203所取代
现在,什么是JSR203?它是一个全新的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();
现在,什么是路径。get()?如前所述,API允许您一次访问多个文件系统;名为的类允许访问JDK可见的所有文件系统(包括创建新的文件系统),默认文件系统(始终存在)由
filesystems.getDefault()
提供
文件系统
实例也提供了