Introduction
In one of my latest projects, I was fiddling around with existing decompression classes, for Zip. I noticed though, that RAR had a far better compression ratio for certain files, and that the existing DLL handled everything itself, including the latest version of the RAR format.
How does the class use 'unrar.dll'?
Unrar.dll is freely distributable, and officially released by RarLabs. It is the interface which existing applications use to manipulate RAR archives. In the class, five functions are exported from the DLL and used.
HANDLE (WINAPI *OpenArchiveEx)(RAROpenArchiveDataEx *pArchiveData);
int (WINAPI *CloseArchive)(HANDLE hArcData);
int (WINAPI *ReadRARHeader)(HANDLE hArcData,
RARHeaderData *pHeaderData);
int (WINAPI *ProcessRARFile)(HANDLE hArcData,
int iOperation, char* strDestFolder, char* strDestName);
int (WINAPI *ReadRARHeaderEx)(HANDLE hArcData,
struct RARHeaderDataEx *HeaderData);
OpenArchiveEx
is used in conjunction with the 'RAROpenArchiveDataEx
' structure, to gain a handle to the open archive, if it succeeds. This can then be used in subsequent calls to the DLL. ReadRARHeader
is what I use in the core UnRAR function. It is used to process the header of the RAR, to gain information about files contained in the RAR. It fills the RARHeaderData
structure with information, including file name, packed size, unpacked etc. ProcessRARFile
is used to perform an action on the current file inside the RAR archive. This can be to test, extract, or to skip the file altogether. After being called, it moves to the next file in the archive. CloseArchive
is used to close the HANDLE
gained from OpenArchiveEx
. ReadRARHeaderEx
is the same as ReadRARHeader
, but contains extra information, such as a Unicode filename.
How it works
CUnrarDLL
wraps the 'unrar.dll', freely available from the WinRAR website, and its interface, into a nice, easy-to-use MFC class. UnRARring archives couldn't be simpler.
Here's an example:
CUnrarDLL unrarObj;
unrarObj.OpenRARFile("MyContent.rar");
unrarObj.SetOutputDirectory("C:\\Output");
unrarObj.UnRARArchive();
This is all well and good, but what if you wanted to learn more about what's inside an archive, before you extract it? No problem. There are two ways to gain information. The first is done automatically when you call 'OpenRARFile
'. Upon opening, CUnrarDLL
loads all the files, their packed and unpacked sizes into a vector, which can be examined as below:
CString fileInfo;
CUnrarFile curFile;
for (int i = 0; i < unrarObj.GetNumberOfFiles(); i++) {
curFile = unrarObj.GetFileAt(i);
fileInfo.Format("File name: %s\nPacked size:"
" %I64d\nUnpacked size: %I64d",
curFile.fileName, curFile.packSize, curFile.unpackSize);
MessageBox(fileInfo);
}
Another method that has been implemented is 'ListFileNames
', which will list only filenames into a CStringArray
.
Updates
- August 4th, 2005: Updated the article.
- August 3rd, 2005: Initial release.