Android P90上ftell无法获取文件大小

背景描述:

    在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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值