我使用的是 Java 1.4.2 和 Debian 6.0.3。网络中有一个共享的 Windows 文件夹,它使用 CIFS 通过 fstab 正确安装到 /mnt/share/
(例如,它在操作系统中完全可见并允许所有操作)。然而,当我尝试在 Java 中执行此操作时:
System.out.println(new File("/mnt/share/").listFiles().length)
它总是返回0
,这意味着listFiles
返回的File[]
为空。同样的问题也适用于 /mnt/share/
的每个子目录。 list
也返回空数组。有趣的是,其他 File
函数(例如“create”、“isDirectory”甚至“delete”)也可以正常工作。从 USB 闪存驱动器 (fat32) 安装的目录也可以正常工作。
我在来自不同 Windows 系统的 2 个不同的“共享文件夹”上进行了测试;一种使用基于域的身份验证系统,另一种使用“简单共享”——即访客访问。这种情况看起来很奇怪,因为安装的目录应该成为文件系统的一部分,因此任何程序都可以使用它。至少我是这么认为的。
我想删除程序中的一个目录,目前除了在 listFiles
上递归遍历之外,我没有看到其他方法可以做到这一点,所以这个错误变得相当烦人。我能想到的唯一“解决方法”是以某种方式运行外部 bash 脚本,但这似乎是一个糟糕的解决方案。
编辑:这似乎是 1.4.2 特有的错误,在 Java 6 中一切正常。但我无法迁移,所以问题仍然存在。
您能建议一些解决方法吗?最好不要切换到第三方库而不是 native 库,我不能说我喜欢为了单个代码行而重写整个项目的想法。
最佳答案
自Java 1.2
起,就有了方法File.getCanonicalFile()
。在您使用已安装目录的情况下,您应该以这种方式使用这个目录:
new File("/mnt/share/").getCanonicalFile().listFiles()
关于Java 1.4.2 File.listFiles 无法与 CIFS 安装正常工作 - 解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10961237/