search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

純C/C++ 自製打包程式 [CB_CAB_PROJECT] – jashliao部落格

純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 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦