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);
  • 相关阅读:
    JavaScript中的闭包
    SQL 备忘
    SqlServer 2005 升级至SP2过程中出现"身份验证"无法通过的问题
    unable to start debugging on the web server iis does not list an application that matches the launched url
    Freebsd 编译内核
    Freebsd 6.2中关于无线网络的设定
    【Oracle】ORA01219
    【Linux】Windows到Linux的文件复制
    【Web】jar命令行生成jar包
    【Linux】CIFS挂载Windows共享
  • 原文地址:https://www.cnblogs.com/rixiang/p/7890471.html
Copyright © 2011-2022 走看看