// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <fstream>
#include <Windows.h>
using namespace std;
#define SECTION_LENGTH 0x0000002E //每个SESION的长度, 不带名字
#define SECTION_DES_LENGTH_POS 0x00000014 //压缩后长度的位置(DWORD, 4字节)
#define SECTION_SRC_LENGTH_POS 0x00000018 //压缩前长度的位置(DWORD, 4字节)
#define SECTION_NAME_LENGTH_POS 0x0000001C //名字长度
#define CONTENT_POS 0x0000002A //内容存储的位置(DWORD, 4字节)
void ReadFileInfo(char *FileName)
{
fstream f(FileName, ios::in|ios::binary);
if ( !f )
{
printf("文件【%s】不存在");
return;
}
streamsize dwResourceSize = 0;
f.seekg(0, ios::end);
dwResourceSize = f.tellg();
printf("资源大小: %08d\n", dwResourceSize);
//--获取索引区起始位置
DWORD dwStartPost = 0;
f.seekg(dwResourceSize - 6);
f.read((char *)&dwStartPost, sizeof(dwStartPost));
printf("索引区起始地址: %08X\n", dwStartPost);
//获取文件数量
WORD dwFileNum = 0;
f.seekg(dwResourceSize - 12);
f.read((char *)&dwFileNum, sizeof(dwFileNum));
printf("文件数量: %08X\n", dwFileNum);
for (int i = 0; i < dwFileNum; i++)
{
f.seekg(dwStartPost + SECTION_DES_LENGTH_POS);
DWORD dwDesLen = 0;
f.read((char *)&dwDesLen, sizeof(dwDesLen));
f.seekg(dwStartPost + SECTION_SRC_LENGTH_POS);
DWORD dwSrcLen = 0;
f.read((char *)&dwSrcLen, sizeof(dwSrcLen));
f.seekg(dwStartPost + SECTION_NAME_LENGTH_POS);
DWORD dwNameLen = 0;
f.read((char *)&dwNameLen, sizeof(dwNameLen));
f.seekg(dwStartPost + SECTION_LENGTH);
TCHAR sFileName[MAX_PATH] = { 0 };
f.read((char *)sFileName, dwNameLen);
printf("原长度: %08X 压缩长度: %08X 文件名长度: %08X 文件名: %s\n", dwSrcLen, dwDesLen, dwNameLen, sFileName);
dwStartPost = dwStartPost + SECTION_LENGTH + dwNameLen;
}
f.close();
}
int _tmain(int argc, _TCHAR* argv[])
{
ReadFileInfo("MTServerSrc.zip");
system("pause");
return 0;
}
读取ZIP文件
最新推荐文章于 2024-07-11 18:57:16 发布