【发布时间】:2016-08-01 19:29:40
【问题描述】:
我正在开发一个项目,该项目在一定程度上显示了 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() is'也更好)。
然而, file.isHidden() 返回 false
canWrite()/canRead()/canExecute() 返回真
getPath() 与 getAbsolutePath() 和 getCanonicalPath() 返回相同
createNewFile() 对所有内容都返回 false,即使是我知道的目录也可以。另外,即使可行,这也是我非常想避免的解决方案。
是否有一些我只是不知道的方法或实现来帮助我查看该目录是否可以访问而无需解析其所有内容?
(我正在运行 Windows 7 Professional,我正在使用 Eclipse Mars 4.5.2,并且 File 的所有实例都是 java.io.File)。
【问题讨论】:
-
如果您想进行准确的文件系统对象操作,请忘记
File并改用 JSR 203。更多详情here. -
我有 3500 行。这有点晚了。不过谢谢,我一定会在我的下一个项目中检查一下。
-
问题是,你必须这样做。
File做不到。期间... -
这是我很长一段时间以来听到的最具毁灭性的消息
-
JSR 203 可以,这就是为什么我包含上面的链接(我已经写了)。我将在下面写一个详细的答案,但无论如何大部分都会重复这个链接。此外,您必须定义“受保护”:用户不能读/写?操作系统是否实施了内置限制?等等等等。