我正在开发一个项目,该项目部分显示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());
其中'folder'是我正在查找的目录,'strings'是该目录中文件的名称列表。这个想法是一个文件只有加载到列表中,如果它是我允许编辑的文件或目录。过滤方面有效,但是有一些目录包含数百个子目录,每个子目录包含数百个文件,并且由于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 :(得分: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()
提供了始终存在的默认文件系统。
FileSystem
个实例还可让您使用FileSystem#getPath
访问Path
。
结合这个,你得到那两个是等价的:
Paths.get(a, b, ...)
FileSystems.getDefault().getPath(a, b, ...)
关于例外:File
处理得非常糟糕。仅举两个例子:
File#createNewFile
将返回false; File#listFiles
对象指向的目录内容,则File
将返回null。JSR 203没有这些缺点,甚至更多。让我们采用两种等效的方法:
File#createNewFile
变为Files#createFile
; File#listFiles
成为Files#newDirectoryStream
(或衍生词;请参阅javadoc)或(自Java 8开始)Files#list
。这些方法和其他方法在行为方面存在根本差异:如果发生故障,它们将抛出异常。
更重要的是,您可以区分这是什么例外:
FileSystemException
或派生词,则错误发生在文件系统级别(例如,"访问被拒绝"是AccessDeniedException
); IOException
,则问题更为根本。这个答案不能包含JSR 203的每个用例;这个API非常庞大,非常完整,虽然并非没有缺陷,但它无论如何都比File
提供的要好得多。
答案 1 :(得分:0)
我在使用C://users/myuser/cookies
之类的路径时也遇到了同样的问题。
我已经使用过JSR203,所以上面的回答对我没有帮助。 就我而言,这些文件的重要属性是隐藏文件。
我最终使用了FileSystemview,该视图根据需要排除了那些文件。
File[] files = FileSystemView.getFileSystemView().getFiles(new File(strHomeDirectory), !showHidden);