2009-01-22 39 views
49

我需要确定用户提供的字符串是否是有效的文件路径(即,如果createNewFile()会成功或抛出异常),但我不想为了验证目的而创建无用的文件而使文件系统膨胀,那么有没有一种方法可以确定我所拥有的字符串是否是有效的文件路径而不尝试创建文件?Java中有没有一种方法可以确定路径是否有效,而不尝试创建文件?

我知道“有效文件路径”的定义取决于操作系统,但我想知道是否有任何快速接受“C:/ foo”或“/ foo”并拒绝“香蕉”的方法。 。一个可能的方法可能是试图创建文件,并最终删除它,如果创建成功,但我希望有一个更优雅的方式来实现相同的结果...

+2

有人能告诉我如何上述问题完全与此相关 - http://stackoverflow.com/questions/13924808/check-if-a-path-is-valid-or-legal-in-java?好的,我可以给出2个相似之处 - 两个都是用英文写的,用'is'这个词。 除此之外还有什么? – 2012-12-18 02:57:18

+0

来自klocwork的相关检查器文档:[SV.PATH](https://developer.klocwork.com/documentation/en/insight/10-1/sv-path):包含有用指南 – boly38 2016-02-04 13:27:19

回答

25

这将检查目录的存在以及。

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

看起来像file.canWrite()没有给你一个明确的指示,如果你有权限写入目录。

+4

呃...我不想要检查文件是否存在,我想检查文件是否可以在当前文件系统上创建 – Raibaz 2009-01-22 11:46:56

+0

问题是在您检查是否可以创建文件后,创建文件的能力可能会改变 – tddmonkey 2009-01-22 11:48:28

+1

krosenvold的代码正在执行以下操作:传入的文件名是否已经作为目录存在,如果不存在,它将存在的目录是否存在?这是有道理的,因为如果目录在那里,你可以创建文件(权限允许)请注意,新文件(“foo”)不会创建文件。 – mtruesdell 2009-01-22 12:45:44

14

许多事情可以去错了,当你尝试创建一个文件:

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

更重要的是,这些可以当你尝试和查询之间改变,看你能不能,当你真正能。在多线程环境中,这是导致竞争状况的主要原因之一,可能是某些程序的真正脆弱点。

基本上你只需要尝试和创建它,看看它是否工作。这是做到这一点的正确方法。这就是为什么像ConcurrentHashMap这样的东西有putIfAbsent(),所以检查和插入是一个原子操作,不会受到竞争条件的影响。这里玩的原则完全一样。

如果这只是某些诊断或安装过程的一部分,只需执行它并查看它是否有效。但是,不能保证它会在稍后工作。

基本上,您的程序必须足够强大,才能优雅地死去,如果它无法写入相关文件。

14

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

-1
boolean canWrite(File file) { 
    if (file.exists()) { 
    return file.canWrite(); 
    } 
    else { 
    try { 
     file.createNewFile(); 
     file.delete(); 
     return true; 
    } 
    catch (Exception e) { 
     return false; 
    } 
    } 
} 
20

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; 
     } 
相关问题