Получить имя файла с учетом регистра, без учета регистра - PullRequest
3 голосов
/ 06 января 2012

Я делаю приложение, в котором пользователь выбирает файл из:

FilePicker.PickFile(filename)

, где filename - строка.

В методе этобудет переводить в:

File file = new File(filename);

и с этим все в порядке.Затем, я делаю,

if(file.exists()){
    System.out.println(file.getName());
}
else{
    System.out.println("Fail.");
}

, и именно здесь начинается проблема.Я хочу получить имя файла, скажем «HELLO.txt», но если filename равно «hello.txt», он все равно проходит проверку file.exists(), а file.getName() возвращается как «hello.txt»не "HELLO.txt".Есть ли способ вернуть file.getName() как регистрозависимую версию как "HELLO.txt?"Спасибо!

Пример:

HELLO.txt is the real file

FilePicker.PickFile("hello.txt");

ВЫХОД:

hello.txt

Ответы [ 3 ]

7 голосов
/ 06 января 2012

Когда вы используете Windows с сохранением регистра (FAT32 / NTFS / ..), вы можете использовать file.getCanonicalFile().getName() для получения канонического имени выбранного файла.

Если вы используете Linux или Android и хотите выбрать файл на основе имени файла, которое не обязательно совпадает с регистром, переберите все файлы в каталоге файла (file.getParent()) и выберите тот, который .equalsIgnoreCase filename.Или см. нечувствительный к регистру File.equals в чувствительной к регистру файловой системе

1 голос
/ 11 февраля 2016
/**
 * Maps lower case strings to their case insensitive File
 */
private static final Map<String, File> insensitiveFileHandlerCache = new HashMap<String, File>();

/**
 * Case insensitive file handler. Cannot return <code>null</code>
 */
public static File newFile(String path) {
    if (path == null)
        return new File(path);
    path = path.toLowerCase();
    // First see if it is cached
    if (insensitiveFileHandlerCache.containsKey(path)) {
        return insensitiveFileHandlerCache.get(path);
    } else {
        // If it is not cached, cache it (the path is lower case)
        File file = new File(path);
        insensitiveFileHandlerCache.put(path, file);

        // If the file does not exist, look for the real path
        if (!file.exists()) {

            // get the directory
            String parentPath = file.getParent();
            if (parentPath == null) {
                // No parent directory? -> Just return the file since we can't find the real path
                return file;
            }

            // Find the real path of the parent directory recursively
            File dir = Util.newFile(parentPath);

            File[] files = dir.listFiles();
            if (files == null) {
                // If it is not a directory
                insensitiveFileHandlerCache.put(path, file);
                return file;
            }

            // Loop through the directory and put everything you find into the cache
            for (File otherFile : files) {
                // the path of our file will be updated at this point
                insensitiveFileHandlerCache.put(otherFile.getPath().toLowerCase(), otherFile);
            }

            // if you found what was needed, return it
            if (insensitiveFileHandlerCache.containsKey(path)) {
                return insensitiveFileHandlerCache.get(path);
            } 
        }
        // Did not find it? Return the file with the original path
        return file;
    }
}

Используйте

File file = newFile(path);

вместо

File file = new File(path);

Он поддерживается кэшем, поэтому он не должен быть слишком медленным.Сделал несколько тестовых прогонов и похоже на работу.Он рекурсивно проверяет родительские каталоги, чтобы узнать, имеют ли они правильные регистры букв.Затем он перечисляет для каждого каталога все файлы и кэширует их правильные буквы.В конце он проверяет, был ли найден файл с путем, и возвращает файл с чувствительным к регистру путем.

0 голосов
/ 09 апреля 2014

Похоже, что в Java 7 и выше в Windows вы можете использовать Path # toRealPath (NOFOLLOW_LINKS) и это будет более правильным, чем getCanonicalFile () при наличии символических ссылок.

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