java - 在 Java 6(不是 7!)中识别依赖于操作系统的无效文件名字符

标签 java filenames

现在我们有一组硬编码的字符,我们要检查这些字符 -- :*?"<>|/\ - 基本上是 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/

相关文章:

java - java中如何将纯文本转换为html超链接?

Java 使用命令行覆盖依赖关系

linux - 当文件名包含空格时 xargs 失败

python - 批量搜索并用python替换文件名中的字符串

获取文件扩展名的PHP函数

java - 将多个选定值插入表中(oracle)

java - Spring JPA Repository 动态查询

java - 默认情况下将jTextArea设置为visible false

java - 将文件名与 id 进行匹配

javascript - Yeoman 提示 : how generate a valid filename from a string?