zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    [转]Java中fina以及static的意义
    [转]Java中this的意义
    [转]Java中子类调用父类构造方法的问题分析
    [原创]SSH中HibernateTemplate与HibernateDaoSupport关系
    [转]No configuration found for the specified action解决办法
    [原创]MyEclipse2014全手动实现反向工程---解决手动整合ssh时发生的、在hibernate反向工程的时候找不到项目名的问题
    [转]SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
    pycharm中运行时添加配置 及pytest模式怎么修改为run模式
    字符串正则匹配替换
    PyCharm选中文件夹新建时Directory与Python package的区别
  • 原文地址:https://www.cnblogs.com/rixiang/p/7890471.html
Copyright © 2011-2022 走看看