C++复制、压缩文件夹

之前写过一篇用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 = 0;
        //文件信息,声明一个存储文件信息的结构体  
        //struct _finddata_t fileinfo;
        struct __finddata64_t fileinfo;
        //字符串,存放路径
        string p;
        if ((hFile = _findfirst64(p.assign(path).append("\*").c_str(), &fileinfo)) != -1)//若查找成功,则进入
        {
            do
            {
                //如果是目录,迭代之
                if ((fileinfo.attrib &  _A_SUBDIR))
                {
                    if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
                        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) == 0);
            //_findclose函数结束查找
            _findclose(hFile);
        }
    }

其实C++17,带的库就支持文件夹复制。如果你用英文google搜索一下,就能找到相关文章https://stackoverflow.com/questions/37325875/copy-directory-content,用百度,呵呵了,就只能搜到上述的那类文章。

压缩文件夹的话,比复制文件夹更麻烦,我暂时没精力去深入研究什么zlib。

最后我想的办法就是使用bat脚本。

用bat运行命令,运行winrar去压缩指定目录文件夹到目标文件。

我的写法:

@echo off
Color a9
"D:	estwinrarWinRAR.exe" a D:	est目标文件.rar D:	est源文件夹
Pause

 上面使用的是绝对路径,我做的项目由于winrar和要压缩的目录都在项目目录所以需要相对路径:

@echo off
Color a9
cd /d %~dp0
"winrarWinRAR.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);
原文地址:https://www.cnblogs.com/rixiang/p/7890471.html