2016-08-01 92 views
0

我正在开发一个项目,其中一部分显示JTable中某个目录中的所有文件,包括子目录。用户可以双击子目录以使用该新目录的内容来更新表格。但是,我遇到了一个问题。如何检查文件/目录是否为受保护的OS文件?

我的文件列表是用file.listFiles()生成的,它可以提取所有内容:隐藏文件,锁定文件,操作系统文件,整个工具包和堆栈,我无法访问所有文件。例如,我没有在“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()isn'或者更好)。

然而, file.isHidden()返回false

canWrite()/的CanRead()/ canExecute()返回true

的getPath()返回同getAbsolutePath()和getCanonicalPath()

createNewFile()对于所有内容都返回false,即使我知道的目录都可以。另外,这是我真正想避免的解决方案,即使这种解决方案有效。

是否有一些方法或实现我只是不知道如何帮助我查看该目录是否可访问,而无需解析其所有内容?我运行的是Windows 7 Professional,我使用的是Eclipse Mars 4.5.2,File的所有实例都是java.io.File)。

+0

如果您想要执行准确的文件系统对象操作,请将'File'忘记并使用JSR 203。更多细节[here](http://java7fs.wikia.com/wiki/Why_File_sucks)。 – fge

+0

我是3500线。这有点晚了。不过谢谢,我一定会在下一个项目中检查一下。 –

+0

问题是,你必须这样做。 '文件'不能这样做。期... – fge

回答

4

您遇到的问题是您正在处理File。据统计,在2016年,事实上,自2011年以来(当Java 7推出时),它已被JSR 203取代。

现在什么是JSR 203?这是一个全新的API来处理任何文件系统和文件系统对象;它扩展了“文件系统”的定义,以包含您在本地计算机上找到的内容(由JDK称为“默认文件系统”)以及您可能使用的其他文件系统。关于如何使用它

样页:here

在这个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()给出。

A FileSystem实例还允许您使用FileSystem#getPath访问Path

结合这一点,你那两个是相同的:

Paths.get(a, b, ...) 
FileSystems.getDefault().getPath(a, b, ...) 

关于例外:File处理它们很差。举两个例子:

  • File#createNewFile将返回false,如果该文件不能被创建;
  • File#listFiles如果由于某种原因无法读取File对象指向的目录内容,将返回null。

JSR 203没有这些缺点,甚至更多。让我们采取两种等效方法:

这些方法和其他方法在行为上有着根本性的区别:在发生故障时,它们会抛出异常。

而且更重要的是,你能区分这是例外:

  • 如果一个FileSystemException或衍生物的错误是在文件系统级别(例如,“拒绝访问”是AccessDeniedException) ;
  • 如果是IOException,那么问题就更加根本。

这个答案不能包含每JSR 203的每个用例;这个API非常广泛,非常完整,虽然不是没有缺陷,但它比任何情况下都要好得多。

+0

可以肯定的是,使用Path与具有File对象“相同”,但更好? –

+0

@MeikVtune不完全;而来自'File'的元数据位于'File'本身内,使用新的API,您需要查询API的其他部分;而'Files'工具类是它的主要入口点。在99%以上的情况下,这足够了,请注意,但某些非常具体的用途可能需要您使用API​​的其他部分 – fge

相关问题