Примеры ошибок File.getCanonicalPath () - PullRequest
14 голосов
/ 20 декабря 2010

Кто-нибудь имеет опыт или знает, когда метод File.getCanonicalPath() выдаст IOException

Я попытался посмотреть в Интернете, и лучший ответ - Файловый API , в котором написано

"IOException - Если возникает ошибка ввода-вывода, которая возможна, потому что построение канонического пути может потребовать запросов файловой системы"

Однако мне это не понятно, потому что я до сих пор не могу вспомнить случай, когда это может закончиться неудачей. Кто-нибудь может привести конкретные примеры, которые могут произойти в Linux, Windows и других ОС (необязательно)?

Я хочу знать, потому что хочу обработать это исключение соответствующим образом. Таким образом, будет лучше, если я буду знать все возможные сбои, которые могут произойти.

Ответы [ 5 ]

18 голосов
/ 20 декабря 2010

Вот пример Windows:

Попробуйте вызвать getCanonicalFile для файла на вашем CD-приводе, но без загруженного 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)
6 голосов
/ 27 декабря 2011

Исключение ввода-вывода также возникает, если мы пытаемся создать объект File с ключевыми словами файла устройства Windows (см. файлы устройства ), используемыми в качестве имени файла.
Как будто вы пытаетесь переименовать файл в эти ключевые слова,Windows не позволит вам сделать это (имена файлов CON, PRN, COM1 и т. Д. Не допускаются), Java также не сможет преобразовать это имя файла в правильный путь.

Итак, любой из следующихследующий код вызовет исключение ввода-вывода:

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 :)
3 голосов
/ 20 декабря 2010

Видно здесь, в Sun Bug Database .

Для JRE 1.4.2_06 File.getCanonicalPath () не работал в Windows для съемного диска, когда в нем нет носителя.

Это исправлено в Java 1.5, но вы можете видеть, что с этим методом могут возникать проблемы с ОС.

Я не знаю ни одной проблемы в настоящее время, но это может случиться, это именно то, что говорит Javadoc. Обычно это быстро исправляется в новейшей версии Java.

2 голосов
/ 16 октября 2014

Вот общий пример для всех ОС:

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;
}

И еслифайл недействителен - вы получите исключение ввода-вывода:

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

Прибыль!

1 голос
/ 05 сентября 2013

Еще один сценарий, когда вы пытаетесь использовать в качестве имени файла недопустимые / недопустимые символы операционной системы.

Для 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 ().

Если мы используем любой из " < > char в имени файла, затем метод getCanonicalPath () не завершается неудачно, но при попытке создать файл вы получите недопустимый аргумент Exception.

См. jdk7 api

Точное определение канонической формы зависит от системы. Здесь я использовал Windows 7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...