NDK拆分合并文件

来源:互联网 发布:淘宝衣服缩水 编辑:程序博客网 时间:2024/05/21 06:12

分割文件合并 可以用于上传大文件的时候进行分割上传等等

java 源码:

package com.fmy.androidsplit;import java.io.File;import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.provider.Settings.System;import android.view.Menu;import android.view.MenuItem;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //要分割的文件地址        File splitfile = new File(Environment.getExternalStorageDirectory(),"fmy.mp4");        File outfile = new File(Environment.getExternalStorageDirectory(),"fmy%d.mp4");        File outmergefile = new File(Environment.getExternalStorageDirectory(),"fmymerge.mp4");        //要        split_file(splitfile.getAbsolutePath(),3,outfile.getAbsolutePath());        merge_file(outfile.getAbsolutePath(),3,outmergefile.getAbsolutePath());    }    static{        java.lang.System.loadLibrary("AndroidSplit");    }    /**     * 分割文件     * @param splitFilePath 要分割的路径     * @param outPath 输出分割路径 其中每个文件末尾用%d代替   如 D:XXX%d.jpg     * @param number 分割数量     */    public  native void split_file(String splitFilePath,int number,String outPath);    /**     * 合并被分割的文件     * @param splitFilePath 被分割的文件路径 且有占位符 %d 如 D:XXX%d.jpg     * @param number 被分割的文件数目     * @param outPath 输出路径     */    public native void merge_file(String splitFilePath,int number,String outPath);}

c源码:

#include <jni.h>#include<com_fmy_androidsplit_MainActivity.h>#include<stdio.h>#include<android/log.h>#include<stdlib.h>#define LOGE(FORMAT,...) __android_log_print(ANDROID_LOG_ERROR,"FMY", FORMAT, __VA_ARGS__)long file_Size(char *path){    FILE *filep = fopen(path,"rb");    fseek(filep,0,SEEK_END);    return ftell(filep);}JNIEXPORT void JNICALL Java_com_fmy_androidsplit_MainActivity_merge_1file(JNIEnv * env, jobject jojt, jstring splitFilePath, jint count, jstring outFilePath){    //占位符路径 如 d:xxx%d.jpg    char * splitFilePathChar = (*env)->GetStringUTFChars(env,splitFilePath,NULL);    //合并文件路徑    char * outFilePathChar = (*env)->GetStringUTFChars(env,outFilePath,NULL);    int var;    //打開輸出文件    FILE * outFilep = fopen(outFilePathChar,"wb");    for (var = 0; var < count; ++var) {        //分割文件路徑名        char * splitFilePathEeatChar = calloc(200,sizeof(char));        //格式化路徑        sprintf(splitFilePathEeatChar,splitFilePathChar,var);        //打開被分割的文件        FILE * filep = fopen(splitFilePathEeatChar,"rb");        int ch;        while((ch=fgetc(filep))!=EOF){            fputc(ch,outFilep);        }        free(filep);        fclose(filep);    }    //關閉輸出文件指向    fclose(outFilep);    //释放指向    (*env)->ReleaseStringUTFChars(env,splitFilePath,splitFilePathChar);    //释放指向    (*env)->ReleaseStringUTFChars(env,outFilePath,outFilePathChar);}JNIEXPORT void JNICALL Java_com_fmy_androidsplit_MainActivity_split_1file(JNIEnv * env, jobject obj, jstring splitFilePath, jint number, jstring outPath){    //分隔文件的路径    char * splitFilePathChar = (*env)->GetStringUTFChars(env,splitFilePath,NULL);    //占位符路径 如 d:xxx%d.jpg    char * outPathChar = (*env)->GetStringUTFChars(env,outPath,NULL);    //输出分割文件的数组指针    FILE ** fileArrayP = calloc(number,sizeof(FILE *));    //分割数据FILE    FILE * splitFile = fopen(splitFilePathChar,"rb");    //文件大小    long fileSize =file_Size(splitFilePathChar);    //每个每个文件大小    long file_black_size [number];    LOGE("文件总大小:%ld",fileSize);    //初始化循环变量    int var = 0;    //每个分割文件大小    long blackSize = fileSize/number;    //循环遍历赋值每个文件    for (; var < number; ++var) {        //每一个输出文件的地址        char * outEachPath  = calloc(200,sizeof(char));        //格式化文件输出路径        sprintf(outEachPath,outPathChar,var);        //每个文件指向        fileArrayP[var] = fopen(outEachPath,"wb");        //释放        free(outEachPath);        //最后一个        if(var==number-1){            //最后一个文件的大小 防止不能被整除            file_black_size[number-1] = blackSize+fileSize%number;        }else{            //每个文件的文件大小 注意如果文件大小不能被number整数那么最后一个文件大小需要重新计算赋值            file_black_size[var] =blackSize;        }    }    //从文件中读取的byte    int ch;    long current = 0;//当前进度    //所有分割数    for (var = 0; var < number; ++var) {        //最后一块        if(var==number-1){            while((ch = fgetc(splitFile))!=EOF){                fputc(ch,fileArrayP[var]);            }        }else{            while(current<blackSize){                ch = fgetc(splitFile);                current++;                fputc(ch,fileArrayP[var]);            }        }        fclose(fileArrayP[var]);        //充值下标        current = 0;    }    free(fileArrayP);    //释放指向    (*env)->ReleaseStringUTFChars(env,splitFilePath,splitFilePathChar);    (*env)->ReleaseStringUTFChars(env,outPath,outPathChar);}
0 0
原创粉丝点击