【问题标题】:How do I detect whether the file system is case-sensitive?如何检测文件系统是否区分大小写?
【发布时间】:2010-11-20 06:15:28
【问题描述】:

我有一个文件夹中的文件名List<String> 和某个文件名String。我想检测文件名是否在列表中,但需要尊重底层文件系统是否区分大小写的属性。

有什么简单的方法可以做到这一点(除了检查System.getProperty("os.name", "").toLowerCase().indexOf("windows")!=-1 的“hack”)? ;-)

【问题讨论】:

  • 请注意,无论如何,“不区分大小写的文件系统”并不等同于“OS 是 Windows”。所有 Windows、Linux 和 Mac OS 都可以使用区分大小写或不区分大小写的文件系统;不要混淆概念。 “hack”是断言小写文件名不存在;用大写的名字创建一个(临时)文件,然后检查是否存在以小写命名的文件。

标签: java filesystems case-sensitive system-properties


【解决方案1】:

不要使用字符串来表示您的文件;使用 java.io.File:

http://java.sun.com/javase/6/docs/api/java/io/File.html#equals(java.lang.Object)

【讨论】:

  • 作为附加说明,您可以使用 File 的 listFiles() 方法对所述目录的 File 对象从目录中获取文件数组。然后可以将其作为数组操作或使用 Arrays.asList 转换为列表
  • 我认为这个答案不适用于 OS X 案例。 OS X 似乎使用 UnixFileSystem 作为其 FileSystem 实现,无论文件是在区分大小写还是不区分大小写的 HFS+ 文件系统上。因此,当传递具有不同大小写的文件名时,File.equals(File) 将在不区分大小写的文件系统上返回 false。编辑:刚刚注意到@SaM 在另一个答案中说了同样的话。
  • 最后我发现了一种使用 File.exists 的复杂方式(确实似乎遵守文件系统的大小写规则)是唯一的方法。
【解决方案2】:
boolean isFileSystemCaseSensitive = !new File( "a" ).equals( new File( "A" ) );

【讨论】:

  • 刚刚在 Mac OSX 上测试过,默认不区分大小写的文件系统,它没有返回预期的结果。
  • 请注意,它不考虑文件系统,只考虑操作系统 - 这个答案并不比接受的答案差。只要你知道就好。我会接受它,因为我找不到将 FS 考虑在内的更好的解决方案。 +1
【解决方案3】:

看来您可以使用IOCase

【讨论】:

  • 再次 - 不适用于 OS X。只是假设区分大小写,因为文件分隔符是正斜杠!有关更多信息,请参阅开发人员之间的讨论:issues.apache.org/jira/browse/IO-171
【解决方案4】:

编写一个名为“HelloWorld”的文件;尝试读取名为“hELLOwORLD”的文件?

【讨论】:

    【解决方案5】:

    我认为现有的任何示例都不能正确处理此问题,您需要将文件写入磁盘。

        private boolean caseSensitivityCheck() {
        try {
            File currentWorkingDir = new File(System.getProperty("user.dir"));
            File case1 = new File(currentWorkingDir, "case1");
            File case2 = new File(currentWorkingDir, "Case1");
            case1.createNewFile();
            if (case2.createNewFile()) {
                System.out.println("caseSensitivityCheck: FileSystem of working directory is case sensitive");
                case1.delete();
                case2.delete();
                return true;
            } else {
                System.out.println("caseSensitivityCheck: FileSystem of working directory is NOT case sensitive");
                case1.delete();
                return false;
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-13
      • 2010-09-30
      • 1970-01-01
      • 2020-01-16
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      相关资源
      最近更新 更多