有没有办法在Java中确定路径是否有效而不尝试创建文件?

Rai*_*baz 66 java filesystems validation

我需要确定一个用户提供的字符串是一个有效的文件路径(即如果createNewFile()将会成功还是抛出一个异常),但我不想臃肿只为验证目的创建的无用文件的文件系统,所以是有没有办法确定我拥有的字符串是否是一个有效的文件路径而不试图创建该文件?

我知道"有效文件路径"的定义因操作系统而异,但我想知道是否有任何快速接受"C:/ foo"或"/ foo"并拒绝"香蕉"的方法...一种可能的方法如果创建成功,可能正在尝试创建文件并最终删除它,但我希望有更优雅的方法来实现相同的结果......

c0d*_*der 33

在Java 7中引入了Path类增加了新的选择,如下所示:
(难道不是下正常工作的Linux -总是返回true)

/**
 * <pre>
 * Checks if a string is a valid path.
 * Null safe.
 *  
 * Calling examples:
 *    isValidPath("c:/test");      //returns true
 *    isValidPath("c:/te:t");      //returns false
 *    isValidPath("c:/te?t");      //returns false
 *    isValidPath("c/te*t");       //returns false
 *    isValidPath("good.txt");     //returns true
 *    isValidPath("not|good.txt"); //returns false
 *    isValidPath("not:good.txt"); //returns false
 * </pre>
 */
public static boolean isValidPath(String path) {
    try {
        Paths.get(path);
    } catch (InvalidPathException | NullPointerException ex) {
        return false;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • @nllsdfx-除了不能在Linux上工作外,它返回true怎么了?如果目录名称中带有句点,那是完全有效的,如果您认为这是错误的... (2认同)

kro*_*old 31

这将检查目录的存在性.

File file = new File("c:\\cygwin\\cygwin.bat");
if (!file.isDirectory())
   file = file.getParentFile();
if (file.exists()){
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果您有权写入目录,似乎file.canWrite()不会给您一个明确的指示.

  • 嗯...我不想检查文件是否存在,我想检查文件是否可以在当前文件系统上创建 (11认同)
  • krosenvold的代码执行以下操作:传入的文件名是否已作为目录存在,如果不存在,该目录将存在吗?这是有道理的,因为如果目录存在,您可以创建文件(允许权限)。请注意,新File(“ foo”)不会创建文件。 (3认同)
  • 备注:您实际上并没有使用 `new File("some/path")` 在文件系统上创建文件。因此,您可以将这些用于验证目的。要在文件系统上创建文件,必须使用 `createNewFile` 等。 (3认同)
  • 我不明白 Java 没有测试路径有效性的本机方法(请不要考虑 Java 7 Path 类,它是“最近的”并且在 Linux 下似乎不成功)。这有什么特别的原因吗?哎呀,在过去的几十年里,路径并没有发生太大的变化。 (2认同)

Zac*_*ena 17

File.getCanonicalPath()对此目的非常有用.IO抛出异常某些类型的无效文件名(例如CON,PRN,*?*在Windows中)针对OS或文件系统解析时.但是,这仅作为初步检查; 在实际创建文件时,您仍然需要处理其他故障(例如,权限不足,驱动器空间不足,安全限制).


cle*_*tus 15

尝试创建文件时可能会出现许多问题:

  • 你缺乏必要的权限;
  • 设备上没有足够的空间;
  • 设备遇到错误;
  • 某些自定义安全策略禁止您创建特定类型的文件;
  • 等等

更重要的是,这些可以在您尝试和查询之间进行更改,以确定您是否可以以及何时可以实现.在多线程环境中,这是竞争条件的主要原因之一,并且可能是某些程序的真正漏洞.

基本上你只需要尝试创建它,看它是否有效.这是正确的方法.这就是为什么事情喜欢ConcurrentHashMap有一个putIfAbsent()这样的检查和INSERT是一个原子操作,不从比赛条件受到影响.完全相同的原则在这里发挥作用.

如果这只是某些诊断或安装过程的一部分,那就去做吧,看看它是否有效.但是,不能保证它会在以后工作.

基本上,如果程序无法编写相关文件,那么程序必须足够健壮才能优雅地存在.

  • DON"T DIE(在某些情况下),允许用户选择另一个卷或媒体.我有一个IDE,当它无法写入其项目文件时就会死亡.那么卷是离线的 - 允许我选择另一个点并继续. (2认同)