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);
如果只按上面代码来解压,那解压后的文件大小和解压前一样。。。。。
...全文
266 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
见习学术士 2008-07-08
  • 打赏
  • 举报
回复
还是楼上的明白我说的。。。感动。。
直接*10就得了。。不过看结果还是大了1.2M。不管了。。
ok1234567 2008-07-08
  • 打赏
  • 举报
回复
自家玩,光着身子更爽呀:)
编解码不会有错的,解压时按大的开空间*10
zlib可以估算压缩后的大小,但是没有提供解压的估算值,是有道理的,因为原始数据的大小你是知道的
参阅:http://blog.csdn.net/andylin02/archive/2006/09/04/1176181.aspx
见习学术士 2008-07-08
  • 打赏
  • 举报
回复
我晕了。。。
这段代码就是用了zlib里的compress函数对文件进行压缩的呀。。
那我再用uncompress函数对压缩文件解压。解压后的文件大小和解压前一样大,所以我就问了:
怎么知道解压文件的大小呢?
dwFileLengthToWrite=(double)dwFileLength*1.001+12+sizeof(DWORD)这个就是实际解压后的文件大小
Conry 2008-07-08
  • 打赏
  • 举报
回复
看不懂lz的压缩代码,也不明白lz所谓“怎么知道解压文件的大小呢”的意思
见习学术士 2008-07-08
  • 打赏
  • 举报
回复
回楼上的,我这个压缩文件的目的是为了在网络上传输文件,上面的函数已可以实现压缩了,可以文件传输过去了要在客户端解压出来。。。问题还没解决,不要沉了呀。。。5555555555
ok1234567 2008-07-08
  • 打赏
  • 举报
回复
zlib只是负责编解码,一个安全的压缩文件应该需要更多的信息,比如文件列表(文件名,原始大小),校验值,加密等信息,可以置于文件的头、尾或交织
见习学术士 2008-07-08
  • 打赏
  • 举报
回复
。。如果要用上面这个压缩的函数解压缩,把compress改成uncompress,那要怎么才能正确解压呢?
dwFileLengthToWrite=(double)dwFileLength*1.001+12+sizeof(DWORD)这个就是实际解压后的文件大小@_@
yjgx007 2008-07-08
  • 打赏
  • 举报
回复
dwFileLengthToWrite=(double)dwFileLength*1.001+12+sizeof(DWORD);
似 乎是个偏移量, 并不是解压后文件size

看下这个示例:
http://www.codeproject.com/KB/atl/zlibstream.aspx

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧