一、文件捆绑
该方法只是实现文件二进制流的附加,并没有改变文件的结构。
建立一个新的二进制文件,先写入第一个捆绑文件的数据和其文件长度,后再直接写入第二个文件的数据和文件长度……。注: 第一个捆绑文件代码这里执行分解文件的操作,则实现了当运行捆绑后的文件时,即把捆绑的文件分解出来,并运行,进行特定操作。而这里在首文件后的数据只是以二进制流的方式加在了首文件尾部,之后的程序并没有运行。
实现代码:
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);
}