getCanonicalFile и getAbsoluteFile возвращают текущий (проектный) каталог вместо ожидаемого - PullRequest
0 голосов
/ 30 ноября 2010

Я пытаюсь создать простую программу, которая содержит функцию просмотра локальной файловой системы.

Однако я столкнулся с проблемой, когда адрес вводится напрямую.

public void setWorkingDirectory(File newDir)
{
    try
    {
        //try to eliminate redundancy
        this.workingDir = newDir.getCanonicalFile();
    }
    catch (IOException e)
    {
        this.workingDir = newDir;
    }
}

Мне нужноабсолютный путь для отображения на экране.Поэтому я использую getCanonicalFile().Все работает нормально, за исключением того, что, когда я ввожу «D:», workingDir будет установлен в текущий каталог проекта в Eclipse (я думаю, что это должен быть текущий каталог, когда выполняется независимо, например, «D: \ EclipseWorkspace \ workspace \ FTPClient») но File newDir содержит точно такой же путь («D:») (я его проследил).

Если я введу «C:» или «D: \», то все в порядке.Я не смог найти никакой информации об этом в Интернете.Может кто-нибудь сказать мне, что здесь происходит и как решить проблему?

Заранее спасибо.

РЕДАКТИРОВАТЬ: я работаю на Windows XP SP3 с Java 6, если это имеет значение.

Ответы [ 2 ]

1 голос
/ 30 ноября 2010

Команда пути

D:

указывает на изменение каталога , выбранного в данный момент на диске D .

В то время как

D:\

указывает на изменение корневого каталога диска D .

Это базовая Windows, вы получите те же результаты в окне консоли (CMD).

Если это действительно проблема, вам нужно посмотреть имя файла и посмотреть, оканчивается ли оно File.separator, а если нет, добавить его.

0 голосов
/ 30 ноября 2010

Не знаю, как это объяснить, getCanonicalFile() использует getCanonicalPath(), который по сути вызывает метод FileSystem.canonicalize(String path) (это абстрактный метод).

В Windows java.io.Win32FileSystem.canonicalize(String path)(который расширяет java.io.FileSystem) вызывает, по сути, один из 2 нативных методов:

protected native String canonicalize0(String path)

ИЛИ

protected native String canonicalizeWithPrefix0(String canonicalPrefix, String pathWithCanonicalPrefix)

Итак, как говорит Крис, этобазовая функция Windows.

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