zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android JNI 删除文件和遍历文件夹并删除文件夹下的文件

Android文件遍历 删除 文件夹 JNI
2023-09-14 09:14:22 时间

对操作文件也是在开发中常用的事情,下面对删除文件和文件夹下的文件做个笔记
1.删除文件

extern "C" JNIEXPORT int JNICALL
Java_com_xinrui_ndkapp_MainActivity_deletefile(JNIEnv *env, jobject instance, jstring str) {
    const char *str_path = env->GetStringUTFChars(str, JNI_FALSE);//本地代码绝不能修改字符串的内容
    if (strlen(str_path) == 0) {
        LOGE("filepath length is 0");
        return -1;
    }
    //"r" 	以“只读”方式打开文件。只允许读取,不允许写入。文件必须存在,否则打开失败。
    //"w" 	以“写入”方式打开文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个新文件)。
    //"a" 	以“追加”方式打开文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么将写入的数据追加到文件的末尾(文件原有的内容保留)。
    //"r+" 	以“读写”方式打开文件。既可以读取也可以写入,也就是随意更新文件。文件必须存在,否则打开失败。
    //"w+" 	以“写入/更新”方式打开文件,相当于w和r+叠加的效果。既可以读取也可以写入,也就是随意更新文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个新文件)。
    //"a+" 	以“追加/更新”方式打开文件,相当于a和r+叠加的效果。既可以读取也可以写入,也就是随意更新文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么将写入的数据追加到文件的末尾(文件原有的内容保留)。
    FILE *file = fopen(str_path, "rw");
    if (file==NULL) {
        LOGE("Fail to open file!");
    } else {
        LOGE("suc to open file!");
        remove(str_path);
    }
    if(file!=NULL){
        fclose(file);
        fflush(file);
    }
    env->ReleaseStringUTFChars(str, str_path);
    return 0;
}

2.删除文件夹下的文件

extern "C" JNIEXPORT int JNICALL
Java_com_xinrui_ndkapp_MainActivity_deletefolder(JNIEnv *env, jobject instance,
                                                 jstring fileFolder) {
    const char *file_folder = env->GetStringUTFChars(fileFolder, 0);

    struct dirent *file;
    char szFileName[128];
    char szFolderName[128];
    strcpy(szFolderName, file_folder);
    strcat(szFolderName, "/%s");
    DIR *pDir = opendir(file_folder);
    if (pDir==NULL) {
        LOGE("can not open dir,check path or permission!");
        return -1;
    }
     // 遍历文件夹并删除文件
    while ((file = readdir(pDir)) != NULL) {
        //判断是不是 . 或者 .. 文件夹 ==0 是 !=0 则不是
        if (strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0) {
            if (file->d_type != DT_DIR) {//文件
                //拼接文件名称
                sprintf(szFileName, szFolderName, file->d_name);
                remove(szFileName);
            } else {
                //是文件夹则遍历
                //构建文件夹路径
                char *path = new char[256];
                memset(path, 0, 256);
                strcpy(path, file_folder);
                strcat(path, "/");
                strcat(path, file->d_name);
                jstring tDir = env->NewStringUTF(path);
                //读取指定文件夹
                Java_com_xinrui_ndkapp_MainActivity_deletefolder(env, instance, tDir);
                //释放文件夹路径内存
                free(path);
            }
        }
    }
    if (pDir != NULL) {
        remove(file_folder);//删除文件夹
        closedir(pDir);
    }
    env->ReleaseStringUTFChars(fileFolder, file_folder);
    return 0;
}