C++基礎三 操作文件 socket 線程 等方法

1.操作文件

文件拆分

JNIEXPORT void JNICALL functionName(JNIEnv *env, jclass jcld, jsting pstring, jstring mstring, jint file_num){
    // 將路徑轉化成char* c可以處理的字符串
    const char* pstr = (*env)->GetStringUTFChars(env, pstring, NULL);
    const char* mstr = (*env)->GetStringUTFChars(env, mstring, NULL);

    // 得到分割之後的子文件的路徑列表
    char ** mstrs = malloc(sizeof(char*)*file_num);
    int i = 0;
    for (; i < file_num; i++) {
        mstrs[i] = malloc(sizeof(char) * 100);
    }

    // 不斷讀取path文件, 循環file_num 個文件中
    int file_size = get_file_size(pstr); // 獲取源文件的文件大小
    FILE *fpr = open(path, "rb");
    
    // 文件個數
    if (file_size % file_num == 0) {
        // 單個文件大小
        int part = file_size / file_num;
        i = 0;
        //
        for (; i < file_num; i++) {
            FILE *fpw = open(strs[i]);
            int j = 0;
            for (; j < part; j++) {
                fputc(get(fpr), fpw);
            }
            close(fpr);
        }
    } else {
        // 不整除
        // 單個文件大小
        int part = file_size / (file_num - 1);
        i = 0;
        //
        for (; i < file_num - 1; i++) {
            FILE *fpw = open(strs[i]);
            int j = 0;
            for (; j < part; j++) {
                fputc(get(fpr), fpw);
            }
            close(fpr);
        }
        // 最後一個    
        FILE *fpw = open(patches[file_num]-1, 'wb');
        i = 0;
        for (; I < filesize % (file_num - 1); i++) {
            fputc(fget(fpr), fpw);
        }
        fclose(fpw);
    }  
     close(fpr);
    // 釋放字符串
    i = 0;    
    for (; i < file_num; i++) {
        free(mstrs[i]);
    }    
    free(mstrs);
    
    (*env)->RelesaeStringUTFChars(env, pstring, pstr);
    (*env)->RelesaeStringUTFChars(env, mstring, mstr);
} 


// 獲取文件大小
int get_file_size(char *path){
    File *fp = fopen(path, "rb");
    fseek(fp, 0, SEEK_END);
    return ftell(fp);
}

文件合併

JNIEXPORT void JNICALL 方法名稱(JNIEnv *env, jclass jcls, jstring pstring, jint fcount, jstring totalstr){
    // 合併之後的文件
    const char *merge_path = (*env)->GetStringUTFChars(env, totalstr, NULL);
    // 分割字文件
    const char *pattern_path = (*env)->GetStringUTFChars(env, pstring, NULL);

    // 得到分割的子文件的路徑列表
    char **patches = malloc(sizeof(char*) * fcount);

    int i = 0;
    for (; i < fcount; i++) {
        patches[I] = malloc(sizeof(char) * 100);
    }
    FILE *fpw = open(merge_path);
    i = 0;
    for (; i < file_num; i++) {
        //每個文件的大小
        int filesize = get_file_size(patches[i]);
        FILE *fpr = open(patches[I], "rb");
        int j= 0;
        for (; j<filesize; j++) {
            fputc(fgetc(), fpw);
        }    
        fclose(fpr);
    }
    fclose(fpw);
}

文件處理使用diff和pach

 

2. socket

3.線程

4.進程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章