2010-12-20 237 views
12

没有人有经验,或者知道什么时候该方法File.getCanonicalPath()将抛出IOExceptionFile.getCanonicalPath()失败的例子

我试图从互联网上查找和最好的答案是File API它说

IOException - 如果发生I/O错误,这是可能的,因为规范路径名的建设可能需要的文件系统查询”

但是,因为我仍然不认为此力量的情况下,是不是很清楚,我失败。任何人都可以给我具体的例子,可以发生在Linux,Windows和其他操作系统(可选)?

我之所以想知道是因为我想要相应地处理这个异常。因此,如果我知道可能发生的所有可能的故障,那将是最好的。

回答

17

下面是一个Windows示例:

尝试在您的CD驱动器文件调用getCanonicalFile,但没有CD加载。例如:

new File("D:\\dummy.txt").getCanonicalFile(); 

您将获得:

Exception in thread "main" java.io.IOException: The device is not ready 
    at java.io.WinNTFileSystem.canonicalize0(Native Method) 
    at java.io.Win32FileSystem.canonicalize(Win32FileSystem.java:396) 
    at java.io.File.getCanonicalPath(File.java:559) 
    at java.io.File.getCanonicalFile(File.java:583) 
+2

+1:很好的例子:) – LaGrandMere 2010-12-20 13:21:26

+0

这是否意味着如果文件不存在,这个方法将会失败,或者它只会失败的可移动驱动器?另外,@LaGrandMere说它已经在Java 1.5中修复了?那么这个例子不再是这种情况了? – gigadot 2010-12-20 13:28:16

+0

@ gigadot:自己试一试,但我认为它会提高IOExpcetion。我的例子是关于一个已修复的错误,但给出的例子应该总是抛出一个IOException,这就是为什么我把+1放在它上面:) – LaGrandMere 2010-12-20 13:32:58

3

Sun Bug Database在这里看到。

对于JRE 1.4.2_06,当驱动器中没有介质时,File.getCanonicalPath()不适用于Windows的可移动驱动器。

它已在Java 1.5中得到纠正,但您可以看到使用此方法可能存在基于操作系统的问题。

我不知道当前有什么问题,但可能会发生,这正是Javadoc所说的。通常它会在最新的Java版本中快速修复。

6

如果我们尝试使用Windows设备文件关键字(请参阅device files)创建文件对象作为文件名,也会发生IO异常。
如果您尝试将文件重命名为这些关键字,Windows将不允许您创建它(不允许CON,PRN,COM1等文件名),但Java也无法将该文件名转换为正确的路径。

因此,任何的下一个下一个代码将特罗的IO异常:

File file = new File("COM1").getContextPath(); 
File file = new File("COM1.txt").getContextPath(); 
File file = new File("C:/somefolder/COM1.txt").getContextPath(); 

然而,接下来的代码应工作:

File file = new File("COM1_.txt").getContextPath(); //underscore wins :) 
1

还有一个场景,当您尝试使用操作系统的限制/无效的字符作为您的文件名。

对于Windows \/: * ? " < > |这些是无效字符。尝试使用以下命令重命名文件:您将收到有关无效字符的气球/提示消息。

请尝试以下Java代码。

File file = new File("c:/outputlog-2013-09-20-22:15"); 
//A common scenario when you try to append java.util.Date to create a file like 
//File newFile = new File(filename + "_" + new Date()); 
System.out.println(file.getAbsolutePath()); 
System.out.println(file.getCanonicalPath()); 

如果文件名包含
* ?你会得到java.io.IOException异常:无效的参数
| :你会得到java.io.IOException异常:文件名,目录名或卷标语法不正确


当您使用getCanonicalPath()方法。

如果我们使用任何" < > 字符的文件名,然后getCanonicalPath()方法是失败,但是当您尝试创建你会得到无效参数异常的文件。

参见jdk7 api

规范形式的精确定义是依赖于系统的。在这里,我已经使用Windows 7的

2

这里是所有的操作系​​统一般示例:

new File("\u0000").getCanonicalFile(); 

文件之前进行规范化,检查其有效性与的java.io.File#isInvalid:

final boolean isInvalid() { 
    if (status == null) { 
     status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED 
                : PathStatus.INVALID; 
    } 
    return status == PathStatus.INVALID; 
} 

如果该文件是无效的 - 你会得到一个IO异常:

public String getCanonicalPath() throws IOException { 
    if (isInvalid()) { 
     throw new IOException("Invalid file path"); 
    } 
    return fs.canonicalize(fs.resolve(this)); 
} 

利润!