我们常常把一些数据存储在网盘中,由于一些原因,我们分享的文件可能被错误和谐,这对于网盘用户来说,肯定是一件不友好的事情,于是我们可以采用加密压缩,但是加密压缩依然容易被和谐,因为可以采用算法带密码直接解密检测,造成了文件被错误和谐的问题依然存在。
于是,按照某站长的需求,我撰写了一个双层压缩的软件,在一定程度上可以缓解和谐问题,尤其是对于大量需要转存文件到网盘的用户,这款软件还是有一定意义的,实际上这款软件之前也发布过关键源代码,这里再次分享一下关键源代码,这次的代码稍微有所优化,主要是考虑到了,双层压缩的时候,实际上第二层压缩已经没有必要使用极限压缩了,这里采用存储(-mx9)的方式,这样做可以大幅度减少等待时间。
软件默认使用四线程,占用CPU100%,发现部分用户在CPU占用方面也有需求,但是这样的话,就需要更多的等待时间,想着这毕竟不是主流需要,所以暂时没有开启自定义线程数目的功能。
更新之后的关键源代码:
//author:autumoon
//联系邮箱:9506#163.com
//日期:2023-01-06
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
if (CStdFile::IfAccessFile(stCurItem))
{
//处理文件
_tstring strDirName = CStdStr::GetNameOfFile(stCurItem, false);
_tstring strDstFile = CStdStr::AddSlashIfNeeded(stDstDir) + strDirName + g_stSuffix;
RenameIfExists(strDstFile);
//有空格的时候,需要添加引号
strDstFile = CStdStr::AddQuoteIfContains(strDstFile);
if (g_b7z)
{
_tstring strCmd = "7z a " + strDstFile + " -ppassword1 -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 + " -hppassword1 " + CStdStr::AddQuoteIfContains(stCurItem);
system(strCmd.c_str());
}
}
#endif // ITEM_ONLY_FILE
#ifdef ITEM_ONLY_DIR
//如果是目录
if (PathIsDirectory(stCurItem.c_str()))
{
//处理文件夹
_tstring strDirName = CStdStr::GetNameOfDir(stCurItem);
_tstring strDstFile1 = CStdStr::AddSlashIfNeeded(stDstDir) + strDirName + g_suffix1;
_tstring strDstFile2 = CStdStr::AddSlashIfNeeded(stDstDir) + strDirName + g_suffix2;
if (g_suffix1 == g_suffix2)
{
return -1;
}
RenameIfExists(strDstFile1);
//有空格的时候,需要添加引号
strDstFile1 = CStdStr::AddQuoteIfContains(strDstFile1);
_tstring strCmd = "7z a " + strDstFile1 + " -p"+ g_pwd1 + " -mhe " + CStdStr::AddQuoteIfContains(CStdStr::AddSlashIfNeeded(stCurItem));
system(strCmd.c_str());
strDstFile2 = CStdStr::AddQuoteIfContains(strDstFile2);
//第二重压缩
strCmd = "7z a -mx9 " + strDstFile2 + " -p" + g_pwd2 + " -mhe " + CStdStr::AddQuoteIfContains(strDstFile1);
system(strCmd.c_str());
strDstFile1 = CStdStr::AddQuoteIfContains(strDstFile1, ' ', false);
if (remove(strDstFile1.c_str()) != 0)
{
bool bRemoved = false;
for (int i = 0; i < 3; ++i)
{
Sleep(1000);
if (DeleteFile(strDstFile1.c_str()))
{
bRemoved = true;
break;
}
}
if (!bRemoved)
{
CLOG::Out("Remove file %s failed!", strDstFile1.c_str());
}
}
}
#endif // ITEM_ONLY_DIR
return 0;
}
软件可以自定义后缀类型,内外层也可以不同,但是本质依然是7z格式,日常使用OK。
压缩结果如下,改了后缀之后,打开会发现里面还有一层加密压缩,软件默认7zx格式。
软件成品暂未公开,但关键源代码已经提供了,可以参考一下,自行实现功能即可。
如果仅仅需要软件成品的,可以私信我取得联系。
想要全套源代码的,也可以私信我取得联系,一起学习交流。