背景描述:
在P90上,File.createNewFile、File.rename、File.delete等文件目录操作无法操作SDCard文件
也不会报错,只会return false;表示执行结果失败
google 推出新的api来管理SDCard卡文件操作DocumentFile
具体操作细节如之前文章 Android 9.0 sdCard文件读写
问题:
通过DocumentFile确实可以解决文件读写问题,但是遇到另一个问题
无法通过ftell获取文件大小。
解决方案:
通过stat获取文件信息中的文件大小
代码如下:
JNIEXPORT jlong Java_demo_second_com_ndkdemo2_NdkHelp_loadFromFilePathIteration(JNIEnv *env, jobject obj, jint handle, jstring filePath, jboolean isIteration)
{
FILE* pfileHandle;
#ifdef ITER_DEBUG
LOGD(" alloc string begin");
#endif
const char* pszPath = env->GetStringUTFChars(filePath, 0);
if (pszPath == 0) {
env->ReleaseStringUTFChars(filePath, pszPath);
return 0;
}
int iPath = strlen(pszPath);
char* pszOut = new char[iPath + 1];
if (pszOut == 0) {
env->ReleaseStringUTFChars(filePath, pszPath);
return 0;
}
strcpy(pszOut, pszPath);
env->ReleaseStringUTFChars(filePath, pszPath);
#ifdef ITER_DEBUG
LOGD(" alloc string end");
#endif
pfileHandle = fopen(pszOut, "r");//fopen打开文件
LOGD("[loadFromFilePathIteration] pfileHandle:%d",pfileHandle);
if (pfileHandle == 0) return -4;
int fseeksize= fseek(pfileHandle, 0, SEEK_END);//fseek把文件指针跳到文件末尾
LOGD("[loadFromFilePathIteration] fseeksize:%d",fseeksize);
long bufLen = ftell(pfileHandle);//ftell拿到文件指针的位置,也就是文件大小
LOGD("[loadFromFilePathIteration] bufLen:%ld",bufLen);
//无法拿到文件大小时,使用stat获取文件信息拿到文件大小
if(bufLen<=0){
struct stat statbuf;
stat(pszPath,&statbuf);
bufLen=statbuf.st_size;
}
LOGD("[loadFromFilePathIteration] bufLen:%ld",bufLen);
jlong ret=0;
if(bufLen<=0){
ret=-1;
}else{
ret=bufLen;
}
return ret;
}