Android проверить, если файл существует с учетом регистра? - PullRequest
1 голос
/ 23 марта 2011

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

new File(PATH_WITH_OLD_CASING) == new File(PATH_WITH_NEW_CASING)

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

new File(PATH_WITH_OLD_CASING).getAbsolutePath() == PATH_WITH_OLD_CASING;

и

new File(PATH_WITH_NEW_CASING).getAbsolutePath() == PATH_WITH_NEW_CASING;

, даже если они ссылаются на один и тот же файл.

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

Есть идеи?

Ответы [ 4 ]

1 голос
/ 04 мая 2011

ОБНОВЛЕНИЕ: не совсем идеальное решение, которое я придумал

if (parentDirectory.listFiles(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return name.contentEquals(DEPRECATED_FILE_NAME);
    }
   }).length > 0){
//old file exists
}
1 голос
/ 23 марта 2011

Вы говорите, что каталог находится на SD-карте, и, скорее всего, в этом ваша проблема.

По умолчанию SD-карта отформатирована как FAT, что сохраняет регистр, но не учитывает регистр.

Это означает, что / sdcard / Hello совпадает с /sdcard/HeLlO.

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

Вы должны использовать getCanonicalPath () вместо getAbsolutePath ():

Большинство вызывающих абонентов должны использовать вместо этого getAbsolutePath ().Канонический путь значительно дороже в вычислении и обычно не полезен.Основное использование канонических путей - это определение, указывают ли два пути на один и тот же файл, путем сравнения канонизированных путей.

0 голосов
/ 23 марта 2011

хмм ... сначала попробуйте перечислить каталог.Пример кода для списка каталога: здесь

, после этого сравните их с именем вашего файла.надеюсь, что это будет работать

0 голосов
/ 23 марта 2011

Вы всегда можете преобразовать имя файла в строковое значение, а затем использовать функции toUpper или toLower для проверки старого файла.Это немного дополнительный шаг в вашем решении, но, возможно, это самый быстрый способ выполнить то, что вы пытаетесь сделать.

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