在Java 6中识别依赖于OS的无效文件名字符(不是7!)

Dav*_*les 3 java filenames

现在我们有一个硬编码的字符集,我们检查 - :*?"<>|/\- 基本上是Windows抱怨的.但是,在Linux上运行时,限制性太强了.

我知道在Java 7 NIO中,Path该类应该足够智能,以依赖于操作系统的方式检查它,InvalidPathException如果指定了无效的文件名,则抛出一个.但是我们没有运行Java 7.在Java 6中有可靠的方法吗?

(请注意,new File("foo:bar")在Windows中不出现工作.但是你实际上如果,例如,尝试用FileWriter写信给你的新File,被称为空文件foo.exists()File将在此时返回true,但它或多或少说谎.)

Dav*_*les 5

由于缺乏任何聪明的东西,这就是我想出的 - 无论如何,它的肉.

严格来说,可能是操作系统和文件系统的组合决定了无效的字符集,但就我的目的而言,仅基于操作系统的黑客似乎已经足够好了.

此外,这些无效的字符集是经验性的,而不是官方的.当您尝试将NTFS卷上的文件重命名为无效时,从XP中获得的错误消息中获取Windows无效字符.对于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;
Run Code Online (Sandbox Code Playgroud)

注意:这是使用SwingX OS实用程序类来确定操作系统,但如果你没有,它也不会做任何神奇的事情 - 只需解析System.getProperty("os.name").