3C科技 娛樂遊戲 美食旅遊 時尚美妝 親子育兒 生活休閒 金融理財 健康運動 寰宇綜合

Zi 字媒體

2017-07-25T20:27:27+00:00
加入好友
純C/C++ 自製打包程式 [CB_CAB_PROJECT] GITHUB: https://github.com/jash-git/CB_CAB_PROJECT.git 01.CB_CustomCAB #include #include #include #include #include #include #include using namespace std; //最多打包文件個數 #define MAX_FILE_COUNT 1024 //最大路徑字元長度 #define MAX_PATH 260 //文件頭 struct FileHead { unsigned int FileCount;//文件個數 unsigned int FileLen[MAX_FILE_COUNT];//文件大小 char FileName[MAX_FILE_COUNT][MAX_PATH];//檔案名 }; char gchrFileName[200],gchrPath[200]; char gchrFileExt[20]; void GetFileName(char *data); long GetFileSize(FILE *pf); int CheckTargetPath(string targetPath); int main(int argc, char *argv[]) { int i=0; int intcase=-1; FILE *pf='\0'; char buf[513]; char buf1[1024]; string strbuf; FILE *pWorkFile = '\0'; FileHead fh; FILE *pOutFile = '\0'; char chrFileListPath[512]; char chrCABFilePath[512]; char chrOuputPath[512]; unsigned char *pTmpData = NULL; char tmpFileName[MAX_PATH]; FILE *pCAB = '\0'; char cwd[512]; cout << "Hello world!" << endl; memset(cwd,0,sizeof(cwd)); if (getcwd(cwd, sizeof(cwd)) != NULL)//抓取目前程式路徑 { cout << "Current working dir: " < vec_file; vec_file.clear(); memset(buf,0,sizeof(buf)); while(fgets(buf,512,pf) != NULL) { buf[strlen(buf)-1]='\0'; memset(buf1,0,sizeof(buf1)); strcpy(buf1,cwd); strcat(buf1,buf); pWorkFile='\0'; pWorkFile= fopen(buf1,"rb"); if(pWorkFile!='\0')//確定檔案存在 & 可讀 { vec_file.push_back(buf1); fclose(pWorkFile); pWorkFile='\0'; } } //當文件內的路徑存到結構體內,並抓取檔案大小 memset(&fh,0,sizeof(FileHead)); fh.FileCount=0; for ( i = 0 ; i < vec_file.size() ; i++ ) { strbuf=vec_file[i]; strcpy(buf, strbuf.c_str()); strcpy(fh.FileName[fh.FileCount],buf); pWorkFile= fopen(fh.FileName[i],"rb"); fh.FileLen[i] = GetFileSize(pWorkFile); fclose(pWorkFile); pWorkFile = '\0'; //printf("%s,%ld\n",fh.FileName[i],fh.FileLen[i]); fh.FileCount++; } //將所有指定檔案打包 //memset(chrCABFilePath,0,sizeof(char)); //strcpy(chrCABFilePath,"test.cab"); //* pOutFile = fopen(chrCABFilePath,"wb"); fwrite(&fh,sizeof(fh),1,pOutFile);//寫入檔頭 for (i = 0 ; i < fh.FileCount ; i++ ) { pWorkFile='\0'; pWorkFile = fopen(fh.FileName[i],"rb"); if ( NULL == pWorkFile ) { fclose(pWorkFile); fclose(pOutFile); return -1; } pTmpData = new unsigned char[fh.FileLen[i]]; fread(pTmpData,fh.FileLen[i],1,pWorkFile); if ( ferror(pWorkFile) ) { fclose(pWorkFile); fclose(pOutFile); return -2; } fwrite(pTmpData,fh.FileLen[i],1,pOutFile); if ( ferror(pOutFile) ) { fclose(pWorkFile); fclose(pOutFile); return -3; } delete [] pTmpData; pTmpData='\0'; fclose(pWorkFile); } fclose(pOutFile); pOutFile='\0'; } else { //*/ //將打包檔解開,放到指定路徑 //strcpy(chrCABFilePath,"D:\\Visual project code\\CB_CustomCAB\\test.cab"); //memset(chrOuputPath,0,sizeof(char)); //strcpy(chrOuputPath, "C:\\CAB_Buf"); if((chdir(chrOuputPath)==0)||(CheckTargetPath(chrOuputPath)==0)) { pCAB = fopen(chrCABFilePath,"rb"); memset(&fh,0x0,sizeof(fh)); fread(&fh,sizeof(fh),1,pCAB);//讀取文件檔頭 for ( int i = 0 ; i < fh.FileCount ; i++ ) { pTmpData = new unsigned char[fh.FileLen[i]]; fread(pTmpData,fh.FileLen[i],1,pCAB); GetFileName(fh.FileName[i]); memset(tmpFileName,0,sizeof(char)); sprintf(tmpFileName,"%s\\%s%s",chrOuputPath,gchrFileName,gchrFileExt); pWorkFile = '\0'; pWorkFile = fopen(tmpFileName,"wb"); fwrite(pTmpData,fh.FileLen[i],1,pWorkFile); fclose(pWorkFile); delete [] pTmpData; pTmpData='\0'; } fclose(pCAB); } } return 0; } //獲取檔大小(傳入以二進制方式打開的檔指針) long GetFileSize(FILE *pf) { //指針移到檔案結尾 fseek(pf,0,/*SEEK_END*/ 2); return ftell(pf); } void GetFileName(char *data) { gchrPath[0]='\0'; gchrFileName[0]='\0'; gchrFileExt[0]='\0'; int i,intcount; int j=0; int k=0; char d; intcount=strlen(data);//計算原本完整檔案路徑長度 for(i=(intcount-1);i>=0;i--) { if((data[i]!='/')&&(data[i]!='\\')) { d=data[i]; gchrPath[j]=d; j++; } else { break; } } gchrPath[j]='\0'; for(int i=0;i 02.CB_createCAB #ifndef CMYCAB_H #define CMYCAB_H #include #include #include #include #include //#include #include using namespace std; //最多打包文件個數 #define MAX_FILE_COUNT 1024 //最大路徑字元長度 #define MAX_PATH 260 //文件頭 struct FileHead { unsigned int FileCount;//文件個數 unsigned int FileLen[MAX_FILE_COUNT];//文件大小 char FileName[MAX_FILE_COUNT][MAX_PATH];//檔案名 }; class CMyCab { private: FileHead fh;//文件頭 char ObjectFilePathName[MAX_PATH];//生成打包檔位置及名稱 public: CMyCab(void); ~CMyCab(void); //添加文件到包內 void AddFile(const char * FilePathName); //設置打包輸出文件 void SetOutPutFile(char * OutFile); //獲取檔大小(傳入以二進制方式打開的檔指針) long GetFileSize(FILE *pf); //製作打包文件 void DoMakeCAB(); //解包(為了節省時間不寫錯誤處理了,可以根據上面自己添加) void DoUnCAB(char *CabFilePathName); private: //顯示打包內檔資訊 void printCAB(); //創建文件夾 void CheckTargetPath(string targetPath); }; #endif // CMYCAB_H #include "CMyCab.h" CMyCab::CMyCab(void) { memset(&fh,0x0,sizeof(fh)); memset(ObjectFilePathName,0x0,sizeof(ObjectFilePathName)); } CMyCab::~CMyCab(void) { } //添加文件到包內 void CMyCab::AddFile(const char * FilePathName) { if ( fh.FileCount >= MAX_FILE_COUNT - 1 ) { cout< #ifndef CSERCHALLFILE_H #define CSERCHALLFILE_H #include #include #include #include #include #include using namespace std; class CSerchAllFile { public: CSerchAllFile(void); ~CSerchAllFile(void); static CSerchAllFile *getInstance(); public: /*void find(char *lpPath); void _find(string path);*/ void get_filelist(char *foldname,vector &filelist); void ReadFile(const char* fileName); void WriteFile(string fileName); }; #endif // CSERCHALLFILE_H #include "CSerchAllFile.h" static CSerchAllFile* instance; CSerchAllFile::CSerchAllFile(void) { } CSerchAllFile::~CSerchAllFile(void) { } CSerchAllFile* CSerchAllFile::getInstance() { if (instance == NULL) { instance = new CSerchAllFile(); } return instance; } //遍歷檔夾下的檔案名列表(包括嵌套檔夾) void CSerchAllFile::get_filelist(char *foldname,vector &filelist) { HANDLE hFind; WIN32_FIND_DATA fileData; string line; char fn[MAX_PATH]; char tmpfn[MAX_PATH]; strcpy(fn,foldname); //需要對檔夾名的字元串進行處理 if(fn[strlen(fn) -1] != '\\' ) { strcat(fn, "\\"); } //留意順序,此時fn已加入"\\" strcpy(tmpfn,fn); //不加*會出錯! strcat(fn, "*"); hFind = FindFirstFile(fn, &fileData); FindNextFile(hFind, &fileData); while(FindNextFile(hFind, &fileData)) { //如果掃描到的當前為檔夾 if (fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if(fileData.cFileName[0]!='.') { char szFile[MAX_PATH]; strcpy(szFile,tmpfn); strcat(szFile,fileData.cFileName); get_filelist(szFile,filelist); } } //掃描到文件 else { line = (string)tmpfn; line+=fileData.cFileName; /*if (line.find(".h",0)!=string::npos) { filelist.push_back(line); } else { continue; }*/ filelist.push_back(line); } //cout< #include #include "CSerchAllFile.h" #include "CMyCab.h" using namespace std; int main() { cout << "Hello world!" << endl; vector vec_file; vector::iterator itemFileName; char filePacketPath[MAX_PATH] = "D:\\VM_Win7\\net4_zip_test";//"D:\\sqliteadmin"; char filePutPath[MAX_PATH] = "D:\\my.cab"; CSerchAllFile::getInstance()->get_filelist(filePacketPath, vec_file); //--------------------打包過程-------------------- //聲明對象 CMyCab mc; //設置輸出文件 mc.SetOutPutFile(filePutPath); //添加要打包的文件 for(itemFileName=vec_file.begin(); itemFileName

本文由jashliaoeuwordpress提供 原文連結

寫了 5860316篇文章,獲得 23313次喜歡
精彩推薦