📄 unrar.cpp
字号:
#define STRICT
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "unrar.h"
CUnRar::CUnRar(LPCTSTR szFileName)
{
struct RARHeaderDataEx HeaderData;
memset(&m_OpenArchiveData, 0, sizeof(m_OpenArchiveData));
memset(&HeaderData, 0, sizeof(HeaderData));
m_OpenArchiveData.ArcName = (char*)szFileName;
m_OpenArchiveData.CmtBuf = NULL;
m_OpenArchiveData.CmtBufSize = 0;
m_OpenArchiveData.OpenMode = RAR_OM_EXTRACT;
m_hArcData = RAROpenArchiveEx(&m_OpenArchiveData);
m_nFileNum = 0;
m_nUnpSize = 0;
if (m_OpenArchiveData.OpenResult != 0)
{
throw "OpenArchive Failed!";
}
if (RARReadHeaderEx(m_hArcData, &HeaderData) != 0)
{
throw "No Archive Found";
}
m_pFirstSizeInfo = NULL;
FILESIZEINFO *pInfo = new FILESIZEINFO;
strncpy(pInfo->szPath, HeaderData.FileName, MAX_PATH);
pInfo->nSize = HeaderData.UnpSize + (((__int64)HeaderData.UnpSizeHigh) << 32);
m_nUnpSize += pInfo->nSize;
m_nFileNum ++;
m_pFirstSizeInfo = pInfo;
if (RARProcessFile(m_hArcData, RAR_SKIP, NULL, NULL) != 0)
{
pInfo->pNext = NULL;
throw "ReadFileList Failed";
}
while ( RARReadHeaderEx(m_hArcData, &HeaderData) == 0)
{
pInfo->pNext = new FILESIZEINFO;
pInfo = pInfo->pNext;
strncpy(pInfo->szPath, HeaderData.FileName, MAX_PATH);
pInfo->nSize = HeaderData.UnpSize + (((__int64)HeaderData.UnpSizeHigh) << 32);
m_nUnpSize += pInfo->nSize;
m_nFileNum ++;
if (RARProcessFile(m_hArcData, RAR_SKIP, NULL, NULL) != 0)
{
pInfo->pNext = NULL;
throw "ReadFileList Failed";
}
}
pInfo->pNext = NULL;
RARCloseArchive(m_hArcData);
}
//-------------------------------------------------------------------------------
CUnRar::~CUnRar()
{
//delete the filesize list
FILESIZEINFO *pInfo = m_pFirstSizeInfo;
FILESIZEINFO *pNextInfo;
while (pInfo)
{
pNextInfo = pInfo->pNext;
delete pInfo;
pInfo = pNextInfo;
}
}
//-------------------------------------------------------------------------------
__int64 CUnRar::GetUnpackSize() const
{
return m_nUnpSize;
}
//-------------------------------------------------------------------------------
int CUnRar::GetFileNum() const
{
return m_nFileNum;
}
int CUnRar::UnpackFile(LPCTSTR szFileName, LPCTSTR szDestPath)
{
struct RARHeaderDataEx HeaderData;
m_hArcData = RAROpenArchiveEx(&m_OpenArchiveData);
if (m_OpenArchiveData.OpenResult != 0)
{
return UNRAR_ERROR_OPENARC;
}
bool bFound = false;
RARSetCallback(m_hArcData, CUnRar::CallbackProc, NULL);
while (RARReadHeaderEx(m_hArcData, &HeaderData) == 0)
{
if (stricmp(HeaderData.FileName, szFileName) == 0)
{
char szOEMPath[MAX_PATH];
CharToOem(szDestPath, szOEMPath);
int nResult = RARProcessFile(m_hArcData, RAR_EXTRACT, szOEMPath, NULL);
RARCloseArchive(m_hArcData);
if (nResult != 0)
{
if (nResult == ERAR_ECREATE)
{
return UNRAR_ERROR_FILEINUSE;
}
return UNRAR_ERROR_EXTRACT;
}
return UNRAR_SUCCESS;
}
if (RARProcessFile(m_hArcData, RAR_SKIP, NULL, NULL) != 0)
{
RARCloseArchive(m_hArcData);
return UNRAR_ERROR_READLIST;
}
}
RARCloseArchive(m_hArcData);
if (!bFound)
{
return UNRAR_ERROR_FILENOTFOUND;
}
return UNRAR_SUCCESS;
}
//-------------------------------------------------
const PFILESIZEINFO CUnRar::GetFileList() const
{
return m_pFirstSizeInfo;
}
int CALLBACK CUnRar::CallbackProc(UINT msg,LONG UserData,LONG P1,LONG P2)
{
switch(msg)
{
case UCM_CHANGEVOLUME:
return(0);
case UCM_PROCESSDATA:
return(0);
case UCM_NEEDPASSWORD:
return(0);
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -