现在我们有一组硬编码的字符,我们要检查这些字符 -- :*?"<>|/\
- 基本上是 Windows 提示的那些。但是,在 Linux 上运行时,这限制太多了。
我知道在 Java 7 NIO 中,Path
类应该足够聪明以依赖于操作系统的方式检查它,并抛出 InvalidPathException
如果您指定了无效的文件名。但是我们没有运行 Java 7。在 Java 6 中是否有可靠的方法来执行此操作?
(请注意,Windows 中的 new File("foo:bar")
确实看起来 可以工作。但是,例如,如果尝试使用 FileWriter
写入新的 File
,您实际得到的是一个名为 foo
的空文件。exists()
上的 File
将在此时返回 true,但它或多或少是在说谎。)
最佳答案
由于缺少任何聪明的东西,这就是我想出的 - 无论如何,它的核心。
严格来说,可能是操作系统和文件系统的组合决定了无效的字符集,但就我的目的而言,仅基于操作系统的 hack 似乎就足够了。
另外,这些无效的字符集是经验性的,而不是官方的。当您尝试将 NTFS 卷上的文件重命名为无效的内容时,Windows 无效字符取自您在 XP 中收到的错误消息。对于 Unix/Linux,我认为除了路径分隔符之外,您几乎可以不用任何东西(如果您了解得更多,请纠正我)。对于 MacOS,:
还是 /
是路径分隔符似乎取决于文件系统——就我而言,最安全的做法是同时包含这两者。 (希望他们没有挂载 FAT 或 NTFS。)
List<Integer> invalidIndices = new LinkedList<Integer>();
String invalidChars;
if (OS.isWindows()) {
invalidChars = "\\/:*?\"<>|";
} else if (OS.isMacOSX()) {
invalidChars = "/:";
} else { // assume Unix/Linux
invalidChars = "/";
}
char[] chars = filename.toCharArray();
for (int i = 0; i < chars.length; i++) {
if ((invalidChars.indexOf(chars[i]) >= 0) // OS-invalid
|| (chars[i] < '\u0020') // ctrls
|| (chars[i] > '\u007e' && chars[i] < '\u00a0') // ctrls
) {
invalidIndices.add(i);
}
}
return invalidIndices;
注意:这是使用 SwingX OS
实用程序类来确定操作系统,但如果您没有它,它也不会做任何神奇的事情——只是解析 System.getProperty("os.name")
.
关于java - 在 Java 6(不是 7!)中识别依赖于操作系统的无效文件名字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2357133/