文件的捆绑与分解

一、文件捆绑

     

该方法只是实现文件二进制流的附加,并没有改变文件的结构。

      建立一个新的二进制文件,先写入第一个捆绑文件的数据和其文件长度,后再直接写入第二个文件的数据和文件长度……。注: 第一个捆绑文件代码这里执行分解文件的操作,则实现了当运行捆绑后的文件时,即把捆绑的文件分解出来,并运行,进行特定操作。而这里在首文件后的数据只是以二进制流的方式加在了首文件尾部,之后的程序并没有运行。

 

实现代码:

 

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
     // TODO: Place code here.
    ::mkdir(".//Result"); //创建目录
    FILE* result; // 合成后的主文件
    result = fopen(FILE_RESULT, "wb"); //创建最终合成文件
    if (result == NULL)
    {
        MessageBox(NULL,"创建绑定后生成的合成文件时出错!/n","错误",MB_OK);
        return false;
    }
    BindFile(result,MAIN_FILE0); // 捆绑分解代码文件 MAIN_FILE0

 

    BindFile(result,BIND_FILE1);
    BindFile(result,BIND_FILE2);
    BindFile(result,BIND_FILE3);
    BindFile(result,BIND_FILE4);
    BindFile(result,BIND_FILE5);

    fclose(result);

    return 0;
}

void BindFile(FILE* mainfile, char* filepath)
{

     struct _stat ST; //用于保存文件信息的结构体
     _stat(filepath, &ST);

     BYTE* buf;  //BYTE = unsigned char
     buf = (BYTE *)malloc(ST.st_size);  // 动态分配内存
     FILE* myself;
     myself = ::fopen(filepath,"rb");
     if(myself == NULL)
     MessageBox(NULL,"原文件打开失败!/n","错误",MB_OK);
     ::fread(buf, 1, ST.st_size, myself);  //读文件
     ::fwrite(buf, 1, ST.st_size, mainfile);  //写文件内容
     ::fwrite(&ST.st_size,1, sizeof(ST.st_size), mainfile);  // 写文件长度
     free(buf);
     fclose(myself);

}

     

二、文件分解

      将文件指针定位到捆绑文件的尾部,读取文件长度,再读取文件数据。。。

 

实现代码:

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    // TODO: Place code here. 
    if(!PathFileExists("C://WINDOWS//system32//MyFile"))  
   ::mkdir("C://WINDOWS//system32//MyFile"); 

   struct _stat ST;
   _stat(FILE_RESULT, &ST);
   mainfile_length = ST.st_size;
   // cout<<"主文件长度字节数为:"<<mainfile_length<<endl;

   FILE* result;  //主文件指针
   result = fopen(FILE_RESULT, "rb");  //打开主文件
   if (result == NULL)
    {
         MessageBox(NULL,"打开自身文件时出错","ERROR",MB_OK);
         return 0;
    }

   UnBindFile(result, FILE1);

   UnBindFile(result, FILE2);
   UnBindFile(result, FILE3);
   UnBindFile(result, FILE4);
   UnBindFile(result, FILE5);
 

   fclose(result);
   ::ShellExecute(NULL,"open",FILE1,NULL,NULL,SW_SHOWNORMAL);
   return 0;
}


void UnBindFile(FILE* mainfile, char* filepath)
{

    long file_length = 0;

    FILE* myfile;  //分解文件
    myfile = fopen(filepath, "wb");
    if (myfile == NULL)
    {
        MessageBox(NULL,"创建第一个被绑定文件时出错","ERROR",MB_OK);
        return ;
    }
 
    //将文件指针定位到主程序最后一个储存长度信息的位置
    int temp = fseek(mainfile, mainfile_length - sizeof(file_length) , 0);  // #define SEEK_SET 0
   if (temp != 0)
   {  

         MessageBox(NULL,"定位文件长度位置指针出错","ERROR",MB_OK);

         return;

    }
   if(mainfile == NULL) 

   {
         MessageBox(NULL,"查找文件长度信息位置出错","ERROR",MB_OK);

         return;

   }
     //将文件长度信息储存在 file_length
   temp = fread(&file_length, sizeof(file_length), 1, mainfile);

   if (temp == 0)
   {
          MessageBox(NULL,"读取第一个被绑定文件长度时出错","ERROR",MB_OK);
          return ;
   }

    //读取文件内容
   BYTE* buf;
   buf = (BYTE*)malloc(file_length); //sizeof(buf) 结果为4
 //查找文件内容位置,储存在
 
  fseek(mainfile, ( mainfile_length - file_length - sizeof(file_length) ), 0);
  //读取文件内容
  fread(buf, 1, file_length, mainfile);
  //分解出文件
  fwrite(buf, 1, file_length, myfile);

  mainfile_length -= ( file_length + sizeof(file_length) ); //保存剩余文件长度

  free(buf);
  fclose(myfile);

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值