问题描述
File.listFiles()
方法列出文件夹的内容。
然而,在Windows上,当您在根驱动器上调用该方法时,它还会产生一些 - 缺少更好的短语 - “虚拟”文件夹(如“文档和设置”,在最近的Windows版本中被“用户”替换) 。
如果您随后为其中一个“虚拟”文件夹调用listFiles(),它将始终返回null。 这就是我的问题所在,因为我想以递归方式遍历所有文件夹。 我需要一种方法来过滤这些文件夹,最好不要检查它们的名字......
普通用户还没有看到一些额外的文件夹(如“系统卷信息”或该驱动器的Recycle-bin文件夹),我很乐意找到一种方法来过滤掉那些文件夹而不会出现黑名单名字。
不幸的是,这些文件夹的行为与真实文件夹一样。
我正在寻找的东西就像File.isSystemFolder()
- File.isSystemFolder()
。
我真的很感谢任何建议
1楼
您可以通过测试返回true
来过滤这些隐藏的系统文件夹。
我不确定“虚拟”文件夹。 我认为只有使用Java 7中的才能区分它们。我必须先在Vista / Win7机器上检查它(我目前在XP上)。
更新 :我在2K3服务器上进行了快速测试,默认情况下, 文档和设置对File#isHidden()
也返回true
,而用户则不然。
你也可以利用它。
2楼
我不认为你会对File.isSystemFolder
方法好运,因为我无法想象对一系列操作系统上的JVM进行足够宽泛的“系统文件夹”定义会很容易能够正确有效地实施。
正如Balus建议的那样,检查非隐藏文件夹是一个良好的开端,并且可能已经足够了(因为这会复制他们在资源管理器shell中看到的内容)。
关于“虚拟”文件夹 - 首先,你确定它们是虚拟的吗?
C:\\Documents and Settings
(或更高版本, C:\\Users
)不是此文件夹的真实,规范路径吗?
如果不是,那么你可以很容易地看到这些杂草出来的窗口是否getCanonicalPath().equals(getAbsolutePath())
只要你用多余的一些假阳性准备.
S和..
S)。
如果这不起作用,那么它们只是普通的文件夹 - 您需要考虑这些文件夹具有哪些逻辑属性,使它们成为“虚拟”。
或者换句话说,提出一些谓词,可以用File
上的方法表示,它捕获你想要过滤的内容。
根据你的英文描述,即使我现在还不确定那些适合和不适合的内容。