2014-09-29 305 views
2

我需要檢查apk文件中是否存在某個目錄。通過本地代碼檢查apk中是否存在目錄(文件夾)

android/asset_manager.h API似乎是不一致的 - 當AAsset* AAssetManager_open(AAssetManager* mgr, const char* filename, int mode);無法打開文件,它返回NULL,但對於目錄AAssetDir* AAssetManager_openDir(AAssetManager* mgr, const char* dirName);的實現總是返回new AAssetDir(...),即使在內部它無法打開/找到的apk的目錄。

AAssetDir是前向聲明的,它的實現被隱藏在.cpp文件中,否則它會(可能?)檢查內部AssetDir對象的有效性。

還有另一種選擇我現在正在探索 - 調用java和做類似:

public static boolean folderExistsInApk(final String path){ 
    AssetManager assetManager = activity.getAssets(); 
    try{ 
     //if .list would fail, it would throw IOException 
     //which would signal that there is no such directory 
     assetManager.list(path); 
    }catch(Exception e){ 
     return false; 
    } 
    return true; 
} 

但似乎「髒」對我來說,它肯定會很慢(這是不這是我特定代碼中的一個重要因素,但仍然 - 避免不必要的悲觀是良好的編碼習慣)。

我錯過了什麼嗎?是否可以通過本機代碼檢查目錄是否存在於apk中?如果沒有 - 如何用jni最好地做到這一點?

+0

http://stackoverflow.com/questions/13317387/how-to-get-file-in-assets-from-android-ndk – NuSkooler 2014-09-29 16:26:26

回答

4

下面的代碼允許檢查,如果在APK包存在某個文件夾:

#include <android/asset_manager.h> 

bool directoryExists(jobject assetManager, const std::string& path){ 
    auto assetDir = AAssetManager_openDir(assetManager, path.c_str()); 
    bool r = AAssetDir_getNextFileName(assetDir) != NULL; 
    AAssetDir_close(assetDir); 
    return r; 
} 

AAsetManager_openDir總是會返回一個指向初始化的對象,即使指定的目錄不存在。換句話說,檢查assetDir==NULL是沒有意義的。訣竅是檢查AAssetDir_getNextFileName是否會返回非空const char *。如果它是NULL - 沒有文件夾,否則 - 有一個。

重要通知:如果一個文件夾是空的,但由於某種原因,您需要知道它是否存在於apk中,由於檢查文件夾存在的方式,該代碼將毫無用處。但AFAIK空文件夾不會複製到apk,所以這種情況是不可能的。

相關問題