zlib解压文件求救.....
见习学术士 2008-07-08 02:30:14 我用这个函数进行的压缩
int CBackupServerDlg::Press(CString path, CString name)
{
HANDLE hFile,hFileToWrite;
hFile =CreateFile(path+name,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
AfxMessageBox("不能打开文件!");
return 0;
}
HANDLE hMapFile,hMapFileToWrite;
hMapFile = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,"ZipTestMappingObjectForRead");
if(hMapFile==NULL)
{
AfxMessageBox("不能创建文件映射!");
return 0;
}
LPVOID lpMapAddress,lpMapAddressToWrite;
lpMapAddress = MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);
if(lpMapAddress==NULL)
{
AfxMessageBox("不能创建文件映射视图!");
return 0;
}
DWORD dwFileLength,dwFileLengthToWrite;
dwFileLength=GetFileSize(hFile,NULL);
dwFileLengthToWrite=(double)dwFileLength*1.001+12+sizeof(DWORD);
hFileToWrite=CreateFile(path+name+".gz",GENERIC_WRITE|GENERIC_READ,
0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFileToWrite==INVALID_HANDLE_VALUE)
{
AfxMessageBox("文件只读!");
return 0;
}
hMapFileToWrite= CreateFileMapping(hFileToWrite,NULL,PAGE_READWRITE,0,dwFileLengthToWrite,
"ZipTestMappingObjectForWrite");
if(hMapFileToWrite==NULL)
{
AfxMessageBox("不能为写入文件创建映射对象!");
return 0;
}
lpMapAddressToWrite=MapViewOfFile(hMapFileToWrite,FILE_MAP_WRITE,0,0,0);
if(lpMapAddressToWrite==NULL)
{
AfxMessageBox("没有找到文件视图文件!");
return 0;
}
LPVOID pBuf=lpMapAddressToWrite;
(*(DWORD*)pBuf)=dwFileLength;
pBuf=(DWORD*)pBuf+1;
compress((Bytef*)pBuf,&dwFileLengthToWrite,(Bytef*)lpMapAddress,dwFileLength);
UnmapViewOfFile(lpMapAddress);
CloseHandle(hMapFile);
CloseHandle(hFile);
UnmapViewOfFile(lpMapAddressToWrite);
CloseHandle(hMapFileToWrite);
SetFilePointer(hFileToWrite,dwFileLengthToWrite+sizeof(DWORD),NULL,FILE_BEGIN);
SetEndOfFile(hFileToWrite);
CloseHandle(hFileToWrite);
}
解压的时候只需把compress换成uncompress函数就可以了,可是怎么知道解压文件的大小呢??
就是这句 dwFileLengthToWrite=(double)dwFileLength*1.001+12+sizeof(DWORD);
如果只按上面代码来解压,那解压后的文件大小和解压前一样。。。。。