现在,我们有一组硬编码的字符,我们检查这些字符-- :*?"<>|/\ --基本上就是Windows抱怨的那些字符。然而,在Linux上运行,这是太限制了。
我知道在Java7NIO中,Path类应该足够聪明,能够以依赖于操作系统的方式检查它,并在指定无效文件名时抛出一个InvalidPathException。但是我们没有运行Java 7,在Java 6中有可靠的方法可以做到这一点吗?
(请注意,Windows中的new File("foo:bar")看起来确实有效。但是,如果尝试使用FileWriter向新的File写入,则实际得到的是一个名为foo的空文件。在那个时候,exists()在File上将返回true,但它或多或少是在撒谎。
发布于 2010-03-04 09:17:58
由于缺乏任何聪明之处,这是我想出的--总之,它的肉。
严格地说,确定无效字符集的可能是操作系统和文件系统的组合,但就我而言,仅仅基于操作系统的黑客攻击似乎已经足够了。
此外,这些无效字符集是经验性的,不是官方的。当尝试将NTFS卷上的文件重命名为无效时,Windows无效字符来自XP中的错误消息。对于Unix/Linux,我认为除了路径分隔符之外,您几乎可以使用任何东西(如果您更了解路径分隔符,请纠正我)。对于MacOS来说,不管:还是/都是路径分隔符,这似乎取决于文件系统--就我的目的而言,将两者都包括进来是最安全的。(希望他们不会增加脂肪或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")。
发布于 2010-12-16 23:33:38
File.getCanonicalPath()可以做到这一点,而不需要创建文件。
只需循环每个可能的字符并存储结果。
发布于 2010-03-01 16:33:36
看看Java7 7的源代码和Java6中的一小部分(对于您必须支持的每一个操作系统),怎么样?
每个extends Path系统都应该有一个类。使用Google CodeSearch(我的疑问)可以快速找到的唯一来源是GaePath.java,它为GaeVFS实现了path的功能。我不认为GaeVFS感兴趣,但是Java7 7的函数为Win32 32/UNIX/.必须在某个地方可用(可能是这里或那里)。
https://stackoverflow.com/questions/2357133
复制相似问题