2010-07-01 143 views
3

File.listFiles()方法列出文件夹的内容。然而,在Windows上调用方法时,它也会产生一些 - 缺少更好的短语 - “虚拟”文件夹(如“Documents and Settings”,在最近的Windows版本中被“用户”取代) 。File.listFiles()并区分物理文件夹与虚拟文件夹

如果你再调用listFiles()对于那些“虚”的一个文件夹,它总是返回null。这就是我的问题所在,因为我想递归遍历所有文件夹。我需要一种方法通过检查他们的名字,以这些文件夹中筛选出最好不...

也有一些额外的文件夹,即普通用户不会看到(如“系统卷标信息”或回收斌该驱动器的文件夹),我很乐意找到一个过滤出来的方法,而不用将名称列入黑名单。

不幸的是,这些文件夹的行为与真实的行为一样。我正在寻找的东西就像是File.isSystemFolder()-方法。

我真的很感激您的任何意见

回答

2

如果File#isHidden()回报true您可以通过测试过滤那些隐藏的系统文件夹。

我不确定“虚拟”文件夹。我认为只有在Java 7中使用New IO 2才能区分它们。我必须首先在Vista/Win7机器上(我目前在XP上)检查它。


更新:我在我们2K3服务器做了一个快速测试中,文件和缺省设置也为File#isHidden()用户不返回true。你也可以使用它。

+0

THX,我与现在 – DeX3 2010-07-02 17:26:00

0

我不认为你会碰到一个File.isSystemFolder方法,因为我无法想象它会很容易强加一个“系统文件夹”的定义,它足够用于一系列操作系统上的JVM能够正确和有用地实施。正如Balus所建议的那样,检查非隐藏文件夹是一个好的开始,并且可能已经足够了(因为它复制了他们在资源管理器shell中看到的内容)。

关于“虚拟”文件夹 - 首先,你确定它们是虚拟的吗?是C:\Documents and Settings(或更高版本,C:\Users)不是这个文件夹的真正的规范路径吗?如果不是,那么你可以通过查看是否getCanonicalPath().equals(getAbsolutePath())(只要你准备好多少误报并用多余的. s和.. s)就可以很容易地将这些排除在窗口之外。

如果这不起作用,那么他们只是普通文件夹 - 你需要考虑什么逻辑性质这些文件夹具有使其“虚拟”。或者换句话说,拿出一些谓词,可以用File上的方法来表达,它捕获你想要过滤的东西。根据你的英文说明,即使我现在还不确定什么可以,哪些不适合。

+0

谢谢你的建议去,规范和绝对路径是不幸的是一样的,所以我要乘坐是否隐藏()方法。也许这不是一个很糟糕的选择,因为用户可能首先要避免隐藏文件夹^^ – DeX3 2010-07-02 17:24:44