仅通过本机代码检查apk中是否存在目录(文件夹)
Checking if directory (folder) exists in apk via native code only
我需要检查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合作?
以下代码允许检查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,所以这种情况是不可能的
- 如何将更多文件夹添加到c++include路径
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- 如何检查特定文件夹中是否存在任何文件?
- 如果C 中不存在,如何创建文件夹
- 当存在许多相互依赖的项目时,Visual C++中的文件夹结构
- 将队列处理为包含文件的文件夹.可能存在的问题
- 如果文件夹不存在,则创建文件夹,如果存在,则不执行任何操作
- 要添加到代码中的标头或内容以检测文件夹是否存在
- 仅通过本机代码检查apk中是否存在目录(文件夹)
- C++中是否有一个函数可以确定给定目录中是否存在特定的文件夹
- 允许 IFileOpenDialog 选取尚不存在的文件夹
- 检查文件夹中是否已经存在文件名
- 在cygwin终端运行时显示不存在的文件夹
- ZERO_CHECK文件夹和Visual Studio 2012的Msbuild存在问题
- 将生成的代码保存在 "rtwbuild" 中的特殊文件夹中
- 如何确定另一个文件夹中存在的文件或文件夹
- 如何从不存在的(在编译时)文件夹链接共享库
- FindNextFile返回的文件夹名称存在问题
- C++:提升:如何检查工作目录中另一个文件夹中是否存在文件夹
- 如何查找文件夹是否存在以及如何创建文件夹