核心代码:
//author:autumoon
//联系QQ:4589968
//日期:2021-01-29
bool CompressDir(const _tstring& stCurItem, const _tstring& stDstDir)
{
_tstring stCurDir(stCurItem);
//读取目录,如果目录下面只有一个目录,则更新目录
std::vector<_tstring> vSubDirs;
int nDirCount = getDirs(stCurItem, vSubDirs, false);
if (nDirCount == 1)
{
stCurDir = vSubDirs[0];
}
if(PathIsDirectory(stCurDir.c_str()))
{
//当前目录中创建百度快捷方式
_tstring st52slg;
if (g_bAddUrl)
{
st52slg = CStdStr::AddSlashIfNeeded(stCurDir) + "百度.url";
CreateShortCut(st52slg.c_str(), "
http://www.baidu.com");
}
//处理文件夹
_tstring strDirName = CStdStr::GetNameOfDir(stCurDir);
_tstring strDstFile = CStdStr::AddSlashIfNeeded(stDstDir) + strDirName + g_stSuffix;
//有空格的时候,需要添加引号
strDstFile = CStdStr::AddQuoteIfContains(strDstFile);
if (g_b7z)
{
_tstring strCmd = "7z a " + strDstFile + " -mhe " + CStdStr::AddQuoteIfContains(CStdStr::AddSlashIfNeeded(stCurDir));
system(strCmd.c_str());
}
else
{
//压缩为rar,默认分卷大小为3.8G
_tstring strCmd = "rar a -v4000000 -ep1 ";
if (g_bRecovery)
{
strCmd += " -rr5p ";
}
//strCmd += strDstFile + " " + CStdStr::AddQuoteIfContains(stCurItem);
strCmd += strDstFile + " " + CStdStr::AddQuoteIfContains(stCurDir);
system(strCmd.c_str());
}
//删除临时的快捷方式
if (g_bAddUrl)
{
DeleteFile(st52slg.c_str());
}
return true;
}
return false;
}
_tstring DeCompressFile(const _tstring& stCurItem, const _tstring& stDstDir)
{
if (CStdFile::IfAccessFile(stCurItem))
{
//处理文件
_tstring strDirName = CStdStr::GetNameOfFile(stCurItem, false);
_tstring strDstFile = CStdStr::AddSlashIfNeeded(stDstDir) + strDirName + g_stSuffix;
_tstring strDstDir = CStdStr::AddSlashIfNeeded(CStdStr::AddSlashIfNeeded(CStdStr::GetDirOfFile(stDstDir)) + strDirName);
//有空格的时候,需要添加引号
strDstFile = CStdStr::AddQuoteIfContains(strDstFile);
if (g_b7z)
{
_tstring strCmd = "7z a " + strDstFile + " -mhe " + CStdStr::AddQuoteIfContains(stCurItem);
system(strCmd.c_str());
}
else
{
//解压缩
_tstring strCmd = "rar x -o+ " + CStdStr::AddQuoteIfContains(stCurItem) + " -p" + g_strPwd + " " + CStdStr::AddQuoteIfContains(CStdStr::AddSlashIfNeeded(strDstDir));
system(strCmd.c_str());
}
return CStdStr::AddSlashIfNeeded(strDstDir, '\\' ,false);
}
return "";
}
bool CompressFile(const _tstring& stCurItem, const _tstring& stDstDir)
{
if (CStdFile::IfAccessFile(stCurItem))
{
//处理文件
_tstring strDirName = CStdStr::GetNameOfFile(stCurItem, false);
_tstring strDstFile = CStdStr::AddSlashIfNeeded(stDstDir) + strDirName + g_stSuffix;
//有空格的时候,需要添加引号
strDstFile = CStdStr::AddQuoteIfContains(strDstFile);
if (g_b7z)
{
_tstring strCmd = "7z a " + strDstFile + " -mhe " + CStdStr::AddQuoteIfContains(stCurItem);
system(strCmd.c_str());
}
else
{
//压缩为rar,默认分卷大小为3.8G
_tstring strCmd = "rar a -v4000000 -ep1 ";
if (g_bRecovery)
{
strCmd += " -rr5p ";
}
strCmd += strDstFile + " " + CStdStr::AddQuoteIfContains(stCurItem);
system(strCmd.c_str());
}
return true;
}
return false;
}
int CompressOneItem(const _tstring& strSrcItem, const _tstring& stDstDir, const size_t& index)
{
//处理所有项目,推荐判断项目是否存在
const _tstring stCurItem = strSrcItem;
const _tstring stDstItem = CStdStr::AddSlashIfNeeded(stDstDir) + CStdStr::GetNameOfFile(stCurItem);
#ifdef ITEM_ONLY_FILE
_tstring strDeCompDir = DeCompressFile(stCurItem, stDstItem);
if (strDeCompDir.length())
{
CompressDir(strDeCompDir, stDstDir);
deleteDir(strDeCompDir, true);
}
#endif // ITEM_ONLY_FILE
#ifdef ITEM_ONLY_DIR
//如果是目录
//读取rar格式的文件,并且逐个处理
std::vector<_tstring> vRarFiles;
size_t nFileCount = getFiles(strSrcItem, vRarFiles, "*.rar");
for (int i = 0; i < nFileCount; ++i)
{
_tstring stSubRarFile = vRarFiles[i];
_tstring stSubRarDir = CStdStr::GetDirOfFile(stSubRarFile);
_tstring stDstSubDir = stDstItem + stSubRarDir.substr(strSrcItem.length());
_tstring strDeCompDir = DeCompressFile(stSubRarFile, stDstSubDir);
if (strDeCompDir.length())
{
const _tstring stSubDstItem = CStdStr::AddSlashIfNeeded(stDstSubDir) + CStdStr::GetNameOfFile(stSubRarFile);
const _tstring stDstSubDir = CStdStr::GetDirOfFile(stSubDstItem);
if (!CStdDir::IfAccessDir(stDstSubDir) && !CStdDir::CreateDir(stDstSubDir))
{
continue;
}
CompressDir(strDeCompDir, stDstSubDir);
deleteDir(strDeCompDir, true);
}
}
#endif // ITEM_ONLY_DIR
return 0;
}
欢迎交流与讨论。