File.getCanonicalPath() failure examples

2022-09-03 04:32:36

有没有人有经验或知道该方法何时会抛出File.getCanonicalPath()IOException

我试图从互联网上查找,最好的答案是在文件API中,它说

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

但是,我不清楚,因为我仍然想不出一个可能失败的情况。任何人都可以给我一些具体的例子,这些例子可以在Linux,Windows和其他操作系统上发生(可选)?

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


答案 1

下面是一个 Windows 示例:

尝试调用 CD 驱动器中的文件,但不加载 CD。例如:getCanonicalFile

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

如果我们尝试使用 Windows 设备文件关键字(请参阅设备文件)作为文件名创建 File 对象,也会发生 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 :)