【问题标题】:Get file.separator of a specified file path获取指定文件路径的file.separator
【发布时间】:2015-06-23 17:10:04
【问题描述】:

如何获取指定文件/文件夹路径的文件分隔符?

在Java中,我们可以写,例如

File f = new File("C:\\MyFolder\\MyText.txt");

请记住,这是一个文件表示形式(文件不必物理存在)。那么给定任何指定的路径,是否有一种方法可以只返回该指定路径的分隔符?

来自docs

File.pathSeparatorFile.pathSeparatorChar 返回系统相关文件分隔符,但我想要的是给定路径的分隔符,就像上面的情况 \,即使上面的程序运行并且路径不是对 *nix 有效

【问题讨论】:

  • 所有路径都有分隔符File.separator
  • 也就是说,在 Linux 上,f 是一个完全有效的路径,分隔符为/,指的是当前目录下名为C:\MyFolder\MyTest.txt 的文件。 (Linux 上的文件名中允许使用反斜杠)
  • 我想要那个指定路径的分隔符,而不是依赖于操作系统
  • 那么你的程序需要以某种方式跟踪它,File 不会为你做。
  • 检查字符串中存在哪一个? (有时也可以接受“c:\folder/file.txt”...所以实际上你最好通过用当前的斜杠替换任何一个斜杠来规范化路径)。

标签: java file operating-system separator


【解决方案1】:

我将从System.getProperty("user.home") 开始。而且,你可以使用File.seperator 喜欢

File f = new File(System.getProperty("user.home") + 
        File.seperator + "MyText.txt");

但我更喜欢File(String parent, String child) 喜欢

File f = new File(System.getProperty("user.home"), "MyText.txt");
System.out.println(f.getPath());

【讨论】:

    【解决方案2】:

    File 对象的分隔符始终由File.separator(或File.separatorChar)给出。没有办法用不寻常的分隔符构造File 对象;它们始终保存在当前系统上有效的路径。

    File f = new File("C:\\MyFolder\\MyText.txt");
    

    在 Windows 上执行此行之后,f 引用了 File 对象,该对象引用了驱动器 C: 上文件夹 MyFolder 中的文件 MyText.txt,正如您可能想要的那样。

    但在 Linux 上,f 指的是一个 File 对象,该对象指的是当前目录中的文件 C:\MyFolder\MyText.txt。 (在 Linux 上,文件名中允许使用反斜杠)

    想象一下,如果有办法做到这一点。如果你有一个用new File("a/b\\c") 构造的文件,那么你怎么知道它是指文件夹a 中的文件b\c(带分隔符/),还是文件夹@ 中的文件c 987654339@(带分隔符\)?

    它不能,所以应该清楚的是没有可靠的方法来做到这一点。如果您的程序处理带有异常分隔符的路径,那么您的程序需要自己处理它们。 File 不能为你做。

    【讨论】:

    • 那么当您为上述示例调用 mkdirs 时会发生什么?行为平台是否依赖?
    • @Nederalm 您具体要问什么?它创建指定的目录,如果它不存在,则递归创建其父目录。
    • 它是否在文件夹 a 或文件夹 a/b 中创建文件夹 b\c,因为它无法知道 c 是否为文件?
    • @Nederalm 这实际上与 mkdirs 无关,而是与 File 有关。在 Linux 上,new File("a/b\\c") 是文件夹 a 内名为 b\c 的文件或文件夹,因此 mkdirs 将创建它。在 Windows 上(其中 \\ 是主要分隔符,但也允许使用 /),它是位于名为 b 的文件夹内名为 c 的文件或文件夹,位于名为 a 的文件夹内,因此 mkdirs 会创建它。在 \\ 是唯一分隔符的某些假设操作系统上,它是文件夹 a\b 内名为 c 的文件或文件夹,因此 mkdirs 会创建它。
    猜你喜欢
    • 2015-08-05
    • 2019-06-09
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多