📄 lzwfile.cpp
字号:
#include "stdafx.h"
#include "lzwtable.h"
#include "lzwcode.h"
#include "lzwfile.h"
// this .cpp is not consider try{}catch{} error case
const int iFileUsedBufferLength=1024*10;
CFile* pfileIn,*pfileOut;
BYTE bEncodeGet[iFileUsedBufferLength],bDecodePut[iFileUsedBufferLength];
DWORD dwEncodeGetTotal;
int iEncodeGetPos,iDecodeGetPos;
BOOL LZWCheckFile(LPCSTR pszCheck)// is the file a HGLZ
{
CFile fileCheck(pszCheck,CFile::modeRead|CFile::typeBinary);
BOOL fR=LZWCheckFile(&fileCheck);
fileCheck.Close();
return fR;
}
BOOL LZWCheckFile(CFile* pfileCheck)// is the file a HGLZ
{
WORD wRead;
DWORD dwRead;
BOOL fR=TRUE;
if(pfileCheck->GetLength()<LZW_MIN_FILE_LENGTH)
return FALSE;
DWORD dwPos=pfileCheck->GetPosition();
pfileCheck->SeekToBegin();
pfileCheck->Read(&dwRead,4);
if(dwRead==LZW_FILE_TAG)
{
pfileCheck->Seek(sizeof(LZWFILEHEAD),CFile::begin);
pfileCheck->Read(&wRead,2);
if(wRead!=LZW_NODE_TAG)
fR=FALSE;
}
else
fR=FALSE;
pfileCheck->Seek(dwPos,CFile::begin);
return fR;
}
int FindFileName(LPCSTR pszName)
{
int iLen=strlen(pszName);
for(int i=iLen-1;i>=0;i--)
{
if(pszName[i]=='\\')
return i+1;
}
return 0;
}
BOOL EncodeGetNextByte(BYTE& bGet)
{
//pfileIn->Read(&bGet,1);
if(iEncodeGetPos==0)
{
int iRead=(dwEncodeGetTotal>=iFileUsedBufferLength)?
iFileUsedBufferLength:(int)dwEncodeGetTotal;
dwEncodeGetTotal-=(DWORD)iRead;
pfileIn->Read(bEncodeGet,iRead);
}
bGet=bEncodeGet[iEncodeGetPos++];
if(iEncodeGetPos>=iFileUsedBufferLength)
iEncodeGetPos=0;
return TRUE;
}
BOOL EncodePutNextBytes(BYTE* pbPut,int iPut)
{
pfileOut->Write(pbPut,iPut);
return TRUE;
}
BOOL DecodePutNextByte(BYTE bPut)
{
pfileOut->Write(&bPut,1);
return TRUE;
}
BOOL DecodeGetNextBytes(BYTE* pbGet,int iGet)
{
pfileIn->Read(pbGet,iGet);
return TRUE;
}
// for batch decompress files
BOOL LZWDecodeFileOnPosition(LPCSTR pszInFile,// compressed file
LPCSTR pszOutPath,// file be decompressed
DWORD dwPos,// the decompressed file position
FUN_LZWDECODEDBYTES pfunDecodedBytes)
{
char szNewPath[1000]={""};
if(pszOutPath!=NULL)
{
strcpy(szNewPath,pszOutPath);
if(szNewPath[strlen(szNewPath)-1]!='\\' &&szNewPath[strlen(szNewPath)-1]!=':')
strcat(szNewPath,"\\");
}
CFile fileIn(pszInFile,
CFile::modeRead|CFile::typeBinary);
CString szOutFile;
DWORD dwFileLength=fileIn.GetLength();
if(dwFileLength
<(sizeof(LZWFILEHEAD)+sizeof(LZWNODEHEAD)+sizeof(LZWSINGLEFILEHEAD)))
{
AfxMessageBox("error hglz file");
fileIn.Close();
return FALSE;
}
LZWFILEHEAD LZWFileHead;
fileIn.Read(&LZWFileHead,sizeof(LZWFILEHEAD));
if(LZWFileHead.dwFileTag!=LZW_FILE_TAG)
{
AfxMessageBox("not hglz file");
fileIn.Close();
return FALSE;
}
if(HIBYTE(LZWFileHead.wVersion)!=0 || LOBYTE(LZWFileHead.wVersion)>10)
{
AfxMessageBox("not the version");
fileIn.Close();
return FALSE;
}
LZWNODEHEAD LZWNodeHead;
fileIn.Read(&LZWNodeHead,sizeof(LZWNODEHEAD));
if(LZWNodeHead.wNodeTag!=LZW_NODE_TAG)
{
AfxMessageBox("not hglz file node");
fileIn.Close();
return FALSE;
}
if(LZWNodeHead.wDirectoryType!=LZW_NODE_BEGIN_COMPRESS)
{
AfxMessageBox("not begin compress");
fileIn.Close();
return FALSE;
}
LZWSINGLEFILEHEAD LZWSingleFileHead;
for(DWORD d=0;d<dwPos;d++)
{// skip the files before
fileIn.Read(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
if(LZWSingleFileHead.wSingleFileTag!=LZW_SINGLE_FILE_TAG)
{
AfxMessageBox("not hglz single file head");
fileIn.Close();
return FALSE;
}
//BYTE *pbFileNameRead=new BYTE[LZWSingleFileHead.wFileNameLength];
//fileIn.Read(pbFileName,LZWSingleFileHead.wFileNameLength);
fileIn.Seek(LZWSingleFileHead.dwFileCompressedLength+
LZWSingleFileHead.wFileNameLength,
CFile::current);
}
fileIn.Read(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
if(LZWSingleFileHead.wSingleFileTag!=LZW_SINGLE_FILE_TAG)
{
AfxMessageBox("not hglz single file head");
fileIn.Close();
return FALSE;
}
BYTE *pbFileName=new BYTE[LZWSingleFileHead.wFileNameLength+1];
fileIn.Read(pbFileName,LZWSingleFileHead.wFileNameLength);
pbFileName[LZWSingleFileHead.wFileNameLength]='\0';
szOutFile=szNewPath;
szOutFile+=(char*)pbFileName;
delete pbFileName;
// create the out file
CFile fileOut(szOutFile,
CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
pfileIn=&fileIn;
pfileOut=&fileOut;
if(LZWSingleFileHead.dwFileCompressedLength!=0)
{
CLZWDecode *pDecode=new CLZWDecode();
pDecode->BeginLZWDecode(LZWSingleFileHead.dwFileCompressedLength,
DecodeGetNextBytes,
DecodePutNextByte,
1024,
(LZWSingleFileHead.dwFileOldLength>1000)?pfunDecodedBytes:NULL,
LZWSingleFileHead.dwFileOldLength/100);
fileOut.Flush();
delete pDecode;
}
fileIn.Close();
fileOut.Close();
return TRUE;
}
// decompress a file
BOOL LZWDecodeFileToFile(LPCSTR pszInFile,
LPCSTR pszOutFile,
DWORD dwPos,
FUN_LZWDECODEDBYTES pfunDecodedBytes)
{
CFile fileIn(pszInFile,
CFile::modeRead|CFile::typeBinary);
DWORD dwFileLength=fileIn.GetLength();
if(dwFileLength
<(sizeof(LZWFILEHEAD)+sizeof(LZWNODEHEAD)+sizeof(LZWSINGLEFILEHEAD)))
{
AfxMessageBox("error hglz file");
fileIn.Close();
return FALSE;
}
LZWFILEHEAD LZWFileHead;
fileIn.Read(&LZWFileHead,sizeof(LZWFILEHEAD));
if(LZWFileHead.dwFileTag!=LZW_FILE_TAG)
{
AfxMessageBox("not hglz file");
fileIn.Close();
return FALSE;
}
if(HIBYTE(LZWFileHead.wVersion)!=0 || LOBYTE(LZWFileHead.wVersion)>10)
{
AfxMessageBox("not the version");
fileIn.Close();
return FALSE;
}
LZWNODEHEAD LZWNodeHead;
fileIn.Read(&LZWNodeHead,sizeof(LZWNODEHEAD));
if(LZWNodeHead.wNodeTag!=LZW_NODE_TAG)
{
AfxMessageBox("not hglz file node");
fileIn.Close();
return FALSE;
}
if(LZWNodeHead.wDirectoryType!=LZW_NODE_BEGIN_COMPRESS)
{
AfxMessageBox("not begin compress");
fileIn.Close();
return FALSE;
}
LZWSINGLEFILEHEAD LZWSingleFileHead;
for(DWORD d=0;d<dwPos;d++)
{// skip the files before
fileIn.Read(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
if(LZWSingleFileHead.wSingleFileTag!=LZW_SINGLE_FILE_TAG)
{
AfxMessageBox("not hglz single file head");
fileIn.Close();
return FALSE;
}
//BYTE *pbFileNameRead=new BYTE[LZWSingleFileHead.wFileNameLength];
//fileIn.Read(pbFileName,LZWSingleFileHead.wFileNameLength);
fileIn.Seek(LZWSingleFileHead.dwFileCompressedLength+
LZWSingleFileHead.wFileNameLength,
CFile::current);
}
fileIn.Read(&LZWSingleFileHead,sizeof(LZWSINGLEFILEHEAD));
if(LZWSingleFileHead.wSingleFileTag!=LZW_SINGLE_FILE_TAG)
{
AfxMessageBox("not hglz single file head");
fileIn.Close();
return FALSE;
}
fileIn.Seek(LZWSingleFileHead.wFileNameLength,CFile::current);
//BYTE *pbFileName=new BYTE[LZWSingleFileHead.wFileNameLength];
//fileIn.Read(pbFileName,LZWSingleFileHead.wFileNameLength);
//delete pbFileName;
// create the out file
CFile fileOut(pszOutFile,
CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
pfileIn=&fileIn;
pfileOut=&fileOut;
if(LZWSingleFileHead.dwFileCompressedLength!=0)
{
CLZWDecode *pDecode=new CLZWDecode();
pDecode->BeginLZWDecode(LZWSingleFileHead.dwFileCompressedLength,
DecodeGetNextBytes,
DecodePutNextByte,
1024,
(LZWSingleFileHead.dwFileCompressedLength>1000)?pfunDecodedBytes:NULL,
LZWSingleFileHead.dwFileCompressedLength/100);
fileOut.Flush();
delete pDecode;
}
fileIn.Close();
fileOut.Close();
return TRUE;
}
// add another file to the compressed file
BOOL LZWAddEncodeFile(LPCSTR pszInFile,// file to be added
LPCSTR pszOutFile,// compressed file
FUN_LZWENCODEDBYTES pfunEncodedBytes)
{
iEncodeGetPos=0;
if(!LZWCheckFile(pszOutFile))
return FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -