Проверить наличие файла в папке активов Android? - PullRequest
28 голосов
/ 29 августа 2010

Мое приложение содержит файлы .txt в подкаталогах в папке активов. Он читает эти файлы .txt и помещает их в текстовое представление. Работает отлично и без проблем.

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

Нужно ли мне проверять наличие файла актива перед тем, как я его прочту, или менеджер активов позаботится обо всем этом? Мне также было интересно, есть ли шанс, что пользователь будет или может удалить и активировать файл.

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

Ответы [ 6 ]

68 голосов
/ 07 сентября 2011

Вы можете быть обеспокоены тем, что файл был удален и apk подал в отставку

Вы можете проверить, используя:

Arrays.asList(getResources().getAssets().list("")).contains("myFile")
25 голосов
/ 31 марта 2011

, если вы действительно хотите проверить существование файла:

AssetManager mg = getResources().getAssets();
InputStream is = null;
try {
  is = mg.open(pathInAssets);
  //File exists so do something with it
} catch (IOException ex) {
  //file does not exist
} finally {
  if (is != null) {
    is.close();
  }
}

Если ваш файл находится в assets/folder/file.ext, тогда pathInAssets будет "folder/file.ext"

6 голосов
/ 07 июля 2016

В идеале, после создания apk никто не может удалить из него какие-либо ресурсы, но если кто-то декомпилирует его и перекомпилирует, это может быть невозможно.

Хотя для других сценариев также, когда актив отсутствует в apk вВо время выполнения мы можем проверить существование актива.

В нашем приложении есть условие для сборки приложения с использованием gradle, ant и eclipse, и для каждого механизма сборки некоторые из наших файлов ресурсов объединяются в apk, а некоторыенет, поэтому, чтобы определить, присутствует ли какой-либо файл активов в текущем сборке apk во время выполнения,

мы делаем это следующим образом:

private boolean isAssetExists(String pathInAssetsDir){
    AssetManager assetManager = AppContext.get().getResources().getAssets();
    InputStream inputStream = null;
    try {
        inputStream = assetManager.open(pathInAssetsDir);
        if(null != inputStream ) {
           return true;
        }
    }  catch(IOException e) {
        e.printStackTrace();
    } finally {
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }  
    return false;
}
4 голосов
/ 29 августа 2010

Да и нет.

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

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

1 голос
/ 30 октября 2018
AssetManager am = getAssets();

    try {
        List<String> mapList = Arrays.asList(am.list("path/in/assets/folder"));

        if (mapList.contains("file_to_check")) {
            Log.e("ERROR", "exists");
        } else {
            Log.e("ERROR", "not exists");
        }
    } catch ( IOException ex){
        ex.printStackTrace();
    }

Преобразовать в функцию или метод может быть легко;)

1 голос
/ 29 августа 2010

Я думаю, что ты должен быть в порядке. Из-за того, что у меня в телефоне есть рут, я не вижу способа удалить оценки, не удаляя приложение, поскольку все они, похоже, заключены в файл .apk. Вы можете сделать это, но я думаю, что вам нужен рут или используйте adb.

В любом случае я бы лично окружил любое чтение / запись блоком try / catch, просто чтобы быть в безопасности.

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