⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unrar.cpp

📁 该程序实现从临时目录解压文件到当前目录的功能
💻 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 + -