struct CAddInfo
{
CAddInfo(){}
CAddInfo(const CString& szName, DWORD iSize, bool bDir = false)
:m_szName(szName), m_iSize(iSize), m_bDir(bDir){}
CString m_szName;
bool m_bDir;
DWORD m_iSize;
};
typedef CList<CAddInfo, CAddInfo> CAddInfoList;
CAddInfoList list;
...
void CJRZipArchive::AddFolder(CString szFolder)
{
try
{
szFolder.TrimRight(_T("\\"));
CFileFind ff;
BOOL b = ff.FindFile(szFolder + _T("\\*"));
CStringArray folders;
while (b)
{
b = ff.FindNextFile();
if (ff.IsDots())
continue;
if (ff.IsDirectory())
{
folders.Add(ff.GetFilePath());
}
else
{
CAddInfo ai;
ai.m_szName = ff.GetFilePath();
CFileStatus fs;
if (CFile::GetStatus(ai.m_szName, fs) )
{
ai.m_bDir = false;
ai.m_iSize = fs.m_size;
list.AddTail(ai);
m_iTotal += fs.m_size;
}
}
}
for (int i = 0; i < folders.GetSize(); i++)
{
list.AddTail(CAddInfo(folders[i], 0, true));
// add the folder before adding its files
// it is not needed to add the root folder
AddFolder(folders[i]);
}
}
catch (CException* e)
{
e->ReportError();
e->Delete();
}
catch(...) // thrown in the STL version
{
AfxMessageBox("Error");
}
}