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

对操作文件也是在开发中常用的事情,下面对删除文件和文件夹下的文件做个笔记
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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android应用开发,如果需要读取本地文件,可以通过JNI(Java Native Interface)来实现。 JNI是用于在Java代码与本地代码(C/C++)之间进行交互的一种技术。通过JNI,我们可以在Java代码调用本地代码来访问系统底层资源,例如读取本地文件。 以下是一种实现方式: 1. 创建一个Java类,用于加载本地库文件和声明本地方法。例如: ``` public class NativeFileReader { static { System.loadLibrary("native-library"); } public static native String readFile(String filePath); } ``` 2. 在本地代码实现读取文件的方法,并将内容转换为字符串返回。例如: ``` #include <jni.h> #include <stdio.h> JNIEXPORT jstring JNICALL Java_com_example_NativeFileReader_readFile(JNIEnv* env, jclass clazz, jstring filePath) { const char* filePathStr = (*env)->GetStringUTFChars(env, filePath, NULL); FILE* file = fopen(filePathStr, "r"); if (file == NULL) { return NULL; } fseek(file, 0, SEEK_END); long fileSize = ftell(file); fseek(file, 0, SEEK_SET); char* buffer = malloc(fileSize + 1); fread(buffer, 1, fileSize, file); buffer[fileSize] = '\0'; fclose(file); (*env)->ReleaseStringUTFChars(env, filePath, filePathStr); jstring result = (*env)->NewStringUTF(env, buffer); free(buffer); return result; } ``` 3. 将本地代码编译为动态库文件,例如libnative-library.so。 4. 将生成的动态库文件放置到项目的jniLibs目录。 5. 在Java代码调用NativeFileReader类的readFile方法,传入要读取的文件路径,就可以得到读取到的文件内容。例如: ``` String filePath = "/sdcard/example.txt"; String fileContent = NativeFileReader.readFile(filePath); ``` 这样,就能够通过JNI来读取本地文件了。需要注意的是,为了保证文件读取的权限,需要在AndroidManifest.xml文件添加文件读写权限的声明。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安卓兼职framework应用工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值