我在做一个测试,试图将两个不同的文件例如
一个RM格式的文件和txt的合并到一起,并且能够把它们还原,
不知道有没有人能给出建议

解决方案 »

  1.   

    (转)
    bool CBindFileDlg::Bind_Files()//合并文件
    {
         FILE* myself;   //自身文件
         FILE* out;      //最终合成文件
         FILE* in;       //待绑定文件
         int bytesin;
         int totalbytes = 0;
         struct _stat ST;
         unsigned int finder = 0x12345678;
         unsigned int i, k;
     int l=1;                //状态显示
     char buff[20];         //状态显示     his_name = strFirstFilePath; //第一个绑定的文件名     _stat(my_name, &ST);
         modify_data.my_length = ST.st_size;
         if (modify_data.my_length == 0)
         {
              MessageBox("绑定文件中,自身文件长度为零时出错!","错误");
      return false;
         }     buf = (BYTE *)malloc(modify_data.my_length);
         if (buf == NULL)
         {
              MessageBox("绑定文件中,分配自身文件长度时出错!","错误");
      return false;
         }     myself = fopen(my_name, "rb");  //打开自身文件
         if (myself == NULL)
         {
              free(buf);
              MessageBox("绑定文件中,打开自身文件时出错!","错误");
      return false;
         }     bytesin = fread(buf, 1, modify_data.my_length, myself);
         fclose(myself);     if (bytesin != modify_data.my_length)
         {
              free(buf);
              MessageBox("绑定文件中,不能完全读取自身文件内容时出错!","错误");
      return false;
         }     for (i = 0; i < modify_data.my_length - sizeof(finder); i += sizeof(finder))
         {
              for (k = 0; k < sizeof(finder); k++)
              {
                   if (buf[i+k] != ((BYTE*)&finder)[k])
                        break;
              }
              if (k == sizeof(finder))   //定位并保存自身数据文件大小
              {
                   memcpy(buf+ i, &modify_data, sizeof(modify_data));
                   break;
              }
         }     if (i >= modify_data.my_length - sizeof(finder))
         {
              free(buf);
              MessageBox("绑定文件中,不能定位自身文件时出错!","错误");
      return false;
         }     if (_stat(strFirstFilePath, &ST) != 0 || ST.st_size == 0)
         {
              free(buf);
              MessageBox("绑定文件中,读取第一个要绑定文件时出错!","错误");
      return false;
         }     list_my_icons();     out = fopen(strFinalFilePath, "wb"); //创建最终合成文件
         if (out == NULL)
         {
              free(buf);
              MessageBox("绑定文件中,创建绑定后生成的合成文件时出错!","错误");
      return false;
         }     totalbytes += fwrite(buf, 1, bytesin, out);     in = fopen(strFirstFilePath, "rb");  //打开第一个要绑定的文件
         if (in == NULL)
         {
              free(buf);
              MessageBox("绑定文件中,打开第一个要绑定文件时出错!","错误");
      return false;
         }  //写入第一个要绑定文件的长度到合成文件中
         totalbytes += fwrite(&ST.st_size, 1, sizeof(ST.st_size), out);  //写入最终分解后文件执行方式的标志位(同步或异步执行)
     UpdateData(TRUE);  //传控件值到变量m_Sync中
     totalbytes += fwrite(&m_Sync, 1, sizeof(int), out);     while (bytesin = fread(buf, 1, modify_data.my_length, in))
         {
              totalbytes += fwrite(buf, 1, bytesin, out);
         }
         fclose(in); //关闭第一个绑定文件句柄  //设置进度条显示
         m_Progress.SetRange(0,500);
         for (int m = 0; m < 500; m++)
    m_Progress.SetPos(m);
     m_Parts = _ltoa(l, buff, 10);
     m_Parts += _T("个文件已绑定");
     UpdateData(FALSE);
     l++;     in = fopen(strSecondFilePath, "rb");   //打开第二个要绑定的文件
         if (in == NULL)
         {
              free(buf);
              MessageBox("绑定文件中,打开第二个要绑定文件时出错!","错误");
      return false;
         }
         while (bytesin = fread(buf, 1, modify_data.my_length, in))
         {
              totalbytes += fwrite(buf, 1, bytesin, out);
         }  //设置进度条显示
         m_Progress.SetRange(0,500);
     for (int n = 0; n < 500; n++)
    m_Progress.SetPos(n);
     m_Parts = _ltoa(l, buff, 10);
     m_Parts += _T("个文件已绑定");
     UpdateData(FALSE);
     l++;     fclose(in);  //关闭第二个绑定文件句柄
         fclose(out); //关闭最终合成文件句柄
         free(buf);   //释放缓冲区  return true;
    }
      

  2.   

    (转)
    void CBindFileDlg::Unbind()//还原文件
    {
         FILE* myself;         //自身文件
         FILE* out;            //分解后文件
         int bytesin;
         int totalbytes = 0;
         char temp_exe1[] = "temp1.exe";  //分解后的绑定文件名一
         char temp_exe2[] = "temp2.exe";  //分解后的绑定文件名二
     int  SyncFlag;        //文件最终执行标志     buf = (BYTE*)malloc(modify_data.my_length);     myself = fopen(my_name, "rb");  //打开最终合成文件
         if (myself == NULL)
         {
     free(buf);
             MessageBox("分离文件中,打开自身文件时出错!","错误");
     return;
         }     out = fopen(temp_exe1, "wb");   //创建第一个绑定的文件
         if (out == NULL)
         {
      free(buf);
              MessageBox("分离文件中,创建第一个被绑定文件时出错!","错误");
      return;
         }  //将文件指针定位到捆绑器程序长度尾部
         fseek(myself, modify_data.my_length, SEEK_SET);  //读取第一个绑定文件的长度 
         if (fread(&prog1_length, sizeof(prog1_length), 1, myself) == 0)
         {
     free(buf);
             MessageBox("分离文件中,读取第一个被绑定文件长度时出错!","错误");
     return;
         }  //读取最终文件执行方式(同步或异步执行)
         if (fread(&SyncFlag, sizeof(int), 1, myself) == 0)
         {
     free(buf);
             MessageBox("分离文件中,读取第一个被绑定文件长度时出错!","错误");
     return;
         }
         
     //读取第一个文件内容并写入
         while (bytesin = fread(buf, 1, sizeof(buf), myself))
         {
              if (totalbytes + bytesin > prog1_length)
                   bytesin = prog1_length - totalbytes;
              totalbytes += fwrite(buf, 1, bytesin, out);
         }
         fclose(out);  //关闭第一个绑定文件句柄#ifdef DEBUG_PRINT
         fprintf(stderr, "已复制 %d 字节!\n", totalbytes);
    #endif DEBUG_PRINT     totalbytes = 0;
         out = fopen(temp_exe2, "wb");      //创建第二个绑定的文件
         if (out == NULL)
         {
      free(buf);
              MessageBox("分离文件中,创建第二个被绑定文件时出错!","错误");
      return;
         }  //将文件指针定位到最终合成文件中的第二个绑定文件头部, 偏移量 ==
     //(捆绑器自身文件长度+保存第一个绑定文件长度所占字节数+保存最终文件执行标志所占字节数+第一个绑定文件长度)
         fseek(myself, modify_data.my_length + sizeof(modify_data.my_length) + sizeof(int) + prog1_length, SEEK_SET);
        
     //读取第二个绑定文件内容并写入
     while (bytesin = fread(buf, 1, sizeof(buf), myself))
         {
              totalbytes += fwrite(buf, 1, bytesin, out);
         }
         fclose(out);  //关闭第二个绑定文件句柄#ifdef DEBUG_PRINT
         fprintf(stderr, "已复制 %d 字节\n", totalbytes);
    #endif DEBUG_PRINT     fclose(myself); //关闭最终合成文件句柄     if (totalbytes == 0)
         {
      free(buf);
              MessageBox("分离文件中,在自身文件中没有被分离的对象!","错误");
      return;
         }  free(buf);   //释放缓冲区  if(!SyncFlag) //0 -- 同步执行,1 -- 异步执行
     {
       //置为分解后,为同步执行方式
           Create_Process(temp_exe1, false); 
           Create_Process(temp_exe2, false);
     }
     else
     {
           //置为分解后,为异步执行方式
           Create_Process(temp_exe1, true); 
           Create_Process(temp_exe2, true);
     }
    }
      

  3.   

    我所提供的程序是VCBASE上的一个例子,
    支持不同类型文件合并.
    如果需要我把代码发给你
      

  4.   

    codeguru里有个吧文件合成EXE文件的例子。用google查。
      

  5.   

    谢谢各位的支持,我的邮箱[email protected]
    请风间苍月把代码发给我研究一下,^_^
      

  6.   

    在www.google.com里输入:ExeCreator+codeguru,就有了!