日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C语言打包解包文件程序(简易版)

發(fā)布時(shí)間:2023/12/19 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言打包解包文件程序(简易版) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • //測(cè)試通過(guò)?科嵌電子 ?
  • ?
  • #include?<stdio.h>? ?
  • #include?<string.h>? ?
  • #include?<stdlib.h>? ?
  • ? ?
  • typedef?unsigned?int??uint;? ?
  • typedef?unsigned?char?byte;???????????? ?
  • ? ?
  • //?包文件中最大可容納的文件個(gè)數(shù)? ?
  • #define?MAX_FILE_COUNT?10? ?
  • ? ?
  • //?全局包文件指針? ?
  • FILE*??g_pMasFile?=?NULL;? ?
  • ?
  • //?資源包文件頭結(jié)構(gòu)? ?
  • typedef?struct?SMaseFileHeader? ?
  • {? ?
  • ?uint??uFileFlag;?????????//?包文件頭標(biāo)記:?'MASE'? ?
  • ?uint??uFileCount;????????//?包內(nèi)文件個(gè)數(shù)? ?
  • ?uint??uFileListOfs;??????//?文件列表偏移? ?
  • ?uint??uMaxFileCount;?????//?最大子文件個(gè)數(shù)? ?
  • ?uint??uFileSize;?????????//?包文件的大小? ?
  • }MaseHeader;? ?
  • ? ?
  • //?包內(nèi)文件信息結(jié)構(gòu)? ?
  • typedef?struct?SFilesMessage? ?
  • {? ?
  • ?uint??uFileOfs;??????????//?本文件在包內(nèi)的偏移? ?
  • ?uint??uFileSize;?????????//?本文件的大小? ?
  • ?char??szFileName[260];???//?本文件的路徑? ?
  • }FilesMsg;? ?
  • ?
  • //?打開(kāi)包文件? ?
  • int?OpenMasFile(const?char*?path,?const?byte?onlyOpen)? ?
  • {? ?
  • ?uint???????uWriteCount;???????//?寫入文件信息次數(shù)? ?
  • ?byte???????bIsNew?=?0;????????//?是否新建的? ?
  • ?MaseHeader?header;????????????//?文件頭結(jié)構(gòu)定義? ?
  • ?FilesMsg???msg;???????????????//?文件信息結(jié)構(gòu)定義 ?
  • ?
  • ?g_pMasFile?=?fopen(path,?"rb");??//?用來(lái)判斷是否存在? ?
  • ?if?(g_pMasFile?==?NULL)?????? ?
  • ?{? ?
  • ??if?(onlyOpen?==?1)????????????//?只打開(kāi)不新建? ?
  • ???return?-1;?? ?
  • ? ?
  • ??bIsNew?=?1;? ?
  • ??g_pMasFile?=?fopen(path,?"wb");? ?
  • ??if?(g_pMasFile?==?NULL)? ?
  • ???return?-1;? ?
  • ?}? ?
  • ?
  • ?//先關(guān)閉,然后在用"rb+"方式打開(kāi)??二進(jìn)制讀寫打開(kāi)文件 ?
  • ?fclose(?g_pMasFile?);? ?
  • ?
  • ?g_pMasFile?=?fopen(path,?"rb+");? ?
  • ?if?(g_pMasFile?==?NULL)? ?
  • ??return?-1;? ?
  • ? ?
  • ?if(bIsNew?==?1)//?新建的文件? ?
  • ?{? ?
  • ??header.uFileFlag?????=?'ESAM';? ?
  • ??header.uFileCount????=?0;? ?
  • ??header.uFileListOfs??=?sizeof(MaseHeader);?//緊跟著就是文件列表? ?
  • ??header.uMaxFileCount?=?MAX_FILE_COUNT;? ?
  • ??header.uFileSize?????=?sizeof(MaseHeader)?? ?
  • ??????????+?(MAX_FILE_COUNT?*?sizeof(FilesMsg));? ?
  • ?
  • ??//寫入頭信息? ?
  • ??fwrite(&header,?sizeof(MaseHeader),?1,?g_pMasFile);? ?
  • ??memset(&msg,?0,?sizeof(FilesMsg));? ?
  • ??uWriteCount?=?MAX_FILE_COUNT;? ?
  • ?
  • ??//寫入文件列表用0占位? ?
  • ??while(uWriteCount--)? ?
  • ?????fwrite(&msg,?sizeof(FilesMsg),?1,?g_pMasFile);? ?
  • ?}? ?
  • ?else//文件存在? ?
  • ?{? ?
  • ????//則讀取頭文件信息? ?
  • ????fread(&header,?sizeof(MaseHeader),?1,?g_pMasFile);? ?
  • ?}? ?
  • ?
  • ?//檢查文件頭標(biāo)記? ?
  • ?if?(header.uFileFlag?!=?'ESAM')? ?
  • ?{? ?
  • ??fclose(g_pMasFile); ?
  • ??printf("文件頭標(biāo)記不對(duì),錯(cuò)誤!\n"); ?
  • ??return?-1;? ?
  • ?}? ?
  • ? ?
  • ?//檢查數(shù)據(jù)是否完整? ?
  • ?if?(header.uMaxFileCount?!=?MAX_FILE_COUNT)? ?
  • ?{? ?
  • ??fclose(g_pMasFile);? ?
  • ??printf("數(shù)據(jù)不完整,錯(cuò)誤!\n"); ?
  • ?????return?-1;? ?
  • ?}? ?
  • ? ?
  • ?return?0;? ?
  • }? ?
  • ? ?
  • //寫文件到包里? ?
  • int?WriteFileToPak(const?char*?path)? ?
  • {? ?
  • ?FilesMsg???fileMsg;??????//此文件的文件信息結(jié)構(gòu)? ?
  • ?MaseHeader?header;???????//包文件頭結(jié)構(gòu)定義? ?
  • ?uint???????uFileSize;? ?
  • ?uint???????uFileListEndOfs;? ?
  • ?byte*??????pBuff;? ?
  • ?FILE*??????pFile?=?NULL;? ?
  • ? ?
  • ?if?(g_pMasFile?==?NULL)? ?
  • ?????return?-1;? ?
  • ? ?
  • ?memset(&fileMsg,?0,?sizeof(FilesMsg));? ?
  • ?fseek(g_pMasFile,?0,?SEEK_SET);????//定位到文件頭,讀取頭文件信息 ?
  • ? ?
  • ?//則讀取頭文件信息? ?
  • ?fread(&header,sizeof(MaseHeader),?1,?g_pMasFile);? ?
  • ? ?
  • ?uFileListEndOfs?=?header.uFileCount?*?sizeof(FilesMsg)?+?header.uFileListOfs;? ?
  • ? ?
  • ?pFile?=?fopen(path,?"rb");? ?
  • ?if(pFile?==?NULL)? ?
  • ?????return?-1;? ?
  • ? ?
  • ?fseek(pFile,?0,?SEEK_END);? ?
  • ?uFileSize?=?ftell(pFile);? ?
  • ?fseek(pFile,?0,?SEEK_SET);? ?
  • ? ?
  • ?//文件名長(zhǎng)度不能超過(guò)260? ?
  • ?strcpy(fileMsg.szFileName,path);? ?
  • ?fileMsg.uFileOfs??=?header.uFileSize;? ?
  • ?fileMsg.uFileSize?=?uFileSize;? ?
  • ? ?
  • ?//?寫入文件信息? ?
  • ?//?將文件指針定位到uFileListEndOfs處,以便寫入新的文件信息結(jié)構(gòu)? ?
  • ?fseek(g_pMasFile,?uFileListEndOfs,?SEEK_SET);? ?
  • ?fwrite(&fileMsg,sizeof(FilesMsg),1,g_pMasFile);? ?
  • ? ?
  • ?//?申請(qǐng)空間? ?
  • ?pBuff?=?(byte*)malloc(uFileSize);? ?
  • ?fread(pBuff,uFileSize,1,pFile);? ?
  • ? ?
  • ?//?寫數(shù)據(jù)到包文件里? ?
  • ?fseek(g_pMasFile,header.uFileSize,SEEK_SET);? ?
  • ?fwrite(pBuff,?uFileSize,?1,?g_pMasFile);? ?
  • ? ?
  • ?//?釋放內(nèi)存? ?
  • ?free(pBuff);? ?
  • ? ?
  • ?//重新填充header? ?
  • ?header.uFileCount?+=?1;? ?
  • ?header.uFileSize??+=?uFileSize;? ?
  • ? ?
  • ?fseek(?g_pMasFile,0,SEEK_SET);? ?
  • ? ?
  • ?//?重新寫入包文件頭? ?
  • ?fwrite(&header,sizeof(MaseHeader),1,g_pMasFile);? ?
  • ? ?
  • ?return?0;? ?
  • }? ?
  • ? ?
  • //從包文件里讀數(shù)據(jù)? ?
  • int?ReadFileFromPak(const?FilesMsg?msg,?byte*?_dst)? ?
  • {? ?
  • ?if?(?g_pMasFile?==?NULL?)? ?
  • ?????return?-1;? ?
  • ? ?
  • ?fseek(g_pMasFile,?msg.uFileOfs,SEEK_SET);? ?
  • ?fread(_dst,?msg.uFileSize,?1,?g_pMasFile);? ?
  • ? ?
  • ?return?0;? ?
  • }? ?
  • ? ?
  • //獲取包中某個(gè)文件的信息? ?
  • int?GetFileMessage(?const?char*?path,?FilesMsg*?msg)? ?
  • {? ?
  • ?FilesMsg???fileMsg;??????//?此文件的文件信息結(jié)構(gòu)? ?
  • ?MaseHeader?header;???????//?包頭結(jié)構(gòu)? ?
  • ?uint???????uFileCount;???//?文件個(gè)數(shù)? ?
  • ? ?
  • ?if?(?g_pMasFile?==?NULL?||?msg?==?NULL?)? ?
  • ?????return?-1;? ?
  • ? ?
  • ?//?則讀取頭文件信息? ?
  • ?fseek(g_pMasFile,?0,?SEEK_SET);? ?
  • ?fread(&header,?sizeof(MaseHeader),?1,?g_pMasFile);? ?
  • ? ?
  • ?uFileCount?=?header.uFileCount;? ?
  • ?while?(uFileCount--)? ?
  • ?{? ?
  • ?????fread(&fileMsg,?sizeof(FilesMsg),?1,g_pMasFile);? ?
  • ?
  • ?????//?判斷是否是要獲取的文件? ?
  • ?????if?(stricmp(fileMsg.szFileName,?path)?==?0?)? ?
  • ?????{????????????? ?
  • ???*msg?=?fileMsg;? ?
  • ?????????return?0;? ?
  • ?????}? ?
  • ?}? ?
  • ?return?-1;? ?
  • }? ?
  • ? ?
  • //?關(guān)閉包文件? ?
  • int?CloseMasFile(?void?)? ?
  • {? ?
  • ?if?(?g_pMasFile?==?NULL?)? ?
  • ?????return?-1;? ?
  • ? ?
  • ?fclose(?g_pMasFile?);? ?
  • ?g_pMasFile?=?NULL;? ?
  • ? ?
  • ?return?0;? ?
  • } ?
  • //這是打包主函數(shù) ?
  • ?
  • int?main(?void?)? ?
  • {? ?
  • ?int?ret;? ?
  • ? ?
  • ?ret?=?OpenMasFile(?"E:\\PhotoPak.bin",0);? ?
  • ?if?(?ret?==?-1?)? ?
  • ?????goto?__exit;???? ?
  • ?WriteFileToPak(?"E:\\珍貴.jpg"?);? ?
  • ?WriteFileToPak(?"E:\\123.docx"?);? ?
  • ?WriteFileToPak(?"E:\\456.txt"?);? ?
  • ?
  • ?__exit:? ?
  • ?CloseMasFile();? ?
  • ?return?0;? ?
  • }?? ?
  • //查看打包中的文件,并且可以解包查看 ?
  • ?
  • int?main(?void?)? ?
  • {? ?
  • ?byte*???????pBuff;? ?
  • ?FILE*???????pOutFile;? ?
  • ?FilesMsg????getFileMsg;? ?
  • ?int?????????ret;? ?
  • ? ?
  • ?ret?=?OpenMasFile("E:\\PhotoPak.bin",?1);? ?
  • ?if?(ret?==?-1)? ?
  • ????goto?__exit;? ?
  • ?? ?
  • ?ret?=?GetFileMessage("E:\\123.docx",?&getFileMsg);? ?
  • ?if(ret?==?-1)? ?
  • ????goto?__exit;? ?
  • ? ?
  • ?pBuff?=?(byte*)malloc(getFileMsg.uFileSize);? ?
  • ?ret?=?ReadFileFromPak(getFileMsg,?pBuff);? ?
  • ?if(ret?==?-1)? ?
  • ?????goto?__exit_free;? ?
  • ? ?
  • ?pOutFile?=?fopen("E:\\123_out.docx",?"wb");??//?注意使用的是二進(jìn)制模式? ?
  • ?if(ret?==?-1)? ?
  • ?????goto?__exit_free;? ?
  • ?? ?
  • ?fwrite(?pBuff,?getFileMsg.uFileSize,?1,?pOutFile?);? ?
  • ????fclose(?pOutFile?);? ?
  • ?????? ?
  • ?__exit_free:? ?
  • ?free(?pBuff?);? ?
  • ? ?
  • ?__exit:? ?
  • ????CloseMasFile();? ?
  • ????return?0;? ?
  • } ?
  • ?
  • ?

    轉(zhuǎn)載于:https://blog.51cto.com/591819849/1101479

    總結(jié)

    以上是生活随笔為你收集整理的C语言打包解包文件程序(简易版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。