Подтвердить что ты не робот

Примеры ошибок File.getCanonicalPath()

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

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

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

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

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

4b9b3361

Ответ 1

Вот пример Windows:

Попробуйте вызвать 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

Исключение IO также возникает, если мы попытаемся создать объект File с ключевыми словами файла устройства Windows (см. файлы устройства), используемые в качестве имени файла.
Как будто вы пытаетесь переименовать файл в эти ключевые слова, 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 :)

Ответ 3

См. здесь База данных Sun Bug.

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

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

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

Ответ 4

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

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

Profit!

Ответ 5

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

Для 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

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