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
寫了
5860316篇文章,獲得
23313次喜歡