之前写过一篇用zlib库来压缩的,但zlib只能压缩文件,我需要压缩文件夹,要想压缩文件夹还得利用zlib库自己写代码,我是真的服了,一个开源库这么不好用。
C++复制文件夹也是麻烦事,网上这篇文章:http://blog.csdn.net/u012750702/article/details/52738859 实现了文件夹复制,但是不能包含子目录的。暂时够我用了。他这个写的也没啥技术含量,就是查找到文件夹下所有文件名,组成目录,然后一个个复制过去。
另外,这篇文章的代码不能实现复制包含子目录文件夹的功能,其实,这个功能很好实现。
只需要查询目录下所有文件名的函数改写一下,实现查询目录下所有文件相对路径(而非文件名),子目录则递归查询。参数std::vector<std::string> file_paths用于存储所有文件相对路径。之后再一个一个复制过去就好了。
之前在网上看过实现查询一个目录下(包含子目录)所有文件路径的功能的函数(下面函数是64位环境的,32位的把对应函数名换成32位的即可):
/*
** 作者:sonne
** 日期:2017-06-12
** 说明:读取制定目录下所有文件路径和文件名
*/
void getFileNamesAndPaths(string path, vector<string>& files, vector<string>& file_name)
{
//文件句柄
__int64 hFile = ;
//文件信息,声明一个存储文件信息的结构体
//struct _finddata_t fileinfo;
struct __finddata64_t fileinfo;
//字符串,存放路径
string p;
if ((hFile = _findfirst64(p.assign(path).append("\\*").c_str(), &fileinfo)) != -)//若查找成功,则进入
{
do
{
//如果是目录,迭代之
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != && strcmp(fileinfo.name, "..") != )
getFileNamesAndPaths(p.assign(path).append("\\").append(fileinfo.name), files, file_name);
}
//如果不是,加入列表
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
file_name.push_back(fileinfo.name);
}
} while (_findnext64(hFile, &fileinfo) == );
//_findclose函数结束查找
_findclose(hFile);
}
}
其实C++17,带的库就支持文件夹复制。如果你用英文google搜索一下,就能找到相关文章https://*.com/questions/37325875/copy-directory-content,用百度,呵呵了,就只能搜到上述的那类文章。
压缩文件夹的话,比复制文件夹更麻烦,我暂时没精力去深入研究什么zlib。
最后我想的办法就是使用bat脚本。
用bat运行命令,运行winrar去压缩指定目录文件夹到目标文件。
我的写法:
@echo off
Color a9
"D:\test\winrar\WinRAR.exe" a D:\test\目标文件.rar D:\test\源文件夹
Pause
上面使用的是绝对路径,我做的项目由于winrar和要压缩的目录都在项目目录所以需要相对路径:
@echo off
Color a9
cd /d %~dp0
"winrar\WinRAR.exe" a back_up.rar cp_dir
Pause
主要是cd /d %~dp0这句,表示到当前路径操作。
C程序里运行这个脚本只需这样写:
#include <windows.h> void main() {
WinExec("D:\\test\\zzz.bat", SW_HIDE);
}
这样做缺点是你必须知道winrar程序路径,或者winrar路径要写在系统环境变量里。
最后我觉得就把winrara程序放在项目目录里好了,反正也不大。
但WinExec只能在32位下使用,64位需要使用ShellExecute。
ShellExecute(NULL,"open","the path",NULL,NULL,SW_SHOWNORMAL);