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 = ;
//文件信息,声明一个存储文件信息的结构体
//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://stackoverflow.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);
C++复制、压缩文件夹的更多相关文章
- C#压缩文件夹坑~
dotNet疯狂之路No.29 今天很残酷,明天更残酷,后天很美好,但是绝大部分人是死在明天晚上,只有那些真正的英雄才能见到后天的太阳. We're here to put a dent in t ...
- C#压缩文件夹
using System;using System.Collections.Generic;using System.Text; ///第三方dllusing ICSharpCode.SharpZip ...
- C#利用SharpZipLib解压或压缩文件夹实例操作
最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享. 这里主要解决文件夹包含文件夹的解压缩问题. )下载SharpZipLib.dll,在http://www.icsharpcode. ...
- Java基础知识强化之IO流笔记50:IO流练习之 复制多级文件夹的案例
1. 复制多级文件夹的案例 需求:复制多级文件夹 数据源:E:\JavaSE\day21\code\demos 目的地:E:\ 分析: A:封装数据源File ...
- Java使用线程池递归压缩文件夹下面的所有子文件
本文将介绍Java中利用线程池递归的方式压缩文件夹下面的所有子文件,具体方法如下: Gzip单个文件压缩 对于单个文件使用GZip压缩. package date0805.demo1; import ...
- .net压缩文件夹
1,引用:using System.IO.Packaging; 2,压缩文件的方法: /// <summary> /// 压缩文件夹到制定的路径 /// </summary> ...
- C#压缩文件,C#压缩文件夹,C#获取文件
using System; using System.Data; using System.Configuration; using System.Collections.Generic; using ...
- 使用7zip批量压缩文件夹到不同压缩包
for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a "%%X.7z" "%%X\" ...
- java中递归实现复制多级文件夹
常见的流的用法 递归实现复制多级文件夹 FileInputStream & FileOutputStream String content = null;//用来储存解码后的byte数组 in ...
随机推荐
- 运算符、单双分支&多分支、while循环
一 .运算符: 1. 算术运算符: " + "." - " ." * " ." / " 分别为加.减.乘.除. % 是& ...
- time模块、装饰器、类的装饰器
python time模块 导入模块: import time #time模块是python中最基本的模块之一 输出时间戳:time.time() #可以用变量接收,要打印出来要用print(),如 ...
- flask-session组件
简介 flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如: redis mem ...
- 查找算法的实现(C/C++实现)
存档: #include <stdio.h> #include <stdlib.h> #define max 20 typedef int keytype; #include ...
- linux命令 uname -r 和 uname -a 的解释与演示
1.uname -r : 显示操作系统的发行版号2.uname -a :显示系统名.节点名称.操作系统的发行版号.内核版本等等. 系统名:Linux 节点名称: iZ2zeeailqvwws5dcui ...
- POI Sax 事件驱动解析Excel2007文件
Excel2007版本的代码如下,本文主要是用于POI解析大文件Excel容易出现内存溢出的现象而提出解决方案,故此解决了大数据量的Excel文件解析的难度,在此拿出来贡献给大家,谢谢! 里面用到的相 ...
- git回退操作
情况一:checkout 当你修改了某个文件,未提交暂存区,回退本次修改 git checkout -- file 情况三:reset 当你的代码,已提交到暂存区,还未提交到远程仓库 git log ...
- Solr学习笔记2(V7.2)---导入自己的数据
学而不思则罔,思而不学则殆,总是看文档不动手效果是不好的.没有实地的从自己的数据库获取数据测试一下始终是空,总结一下自己的操作步骤吧. 第一步准备配置文件 E:\Solr\server\solr\co ...
- LNMP下FTP服务器的安装和使用(Pureftpd和Proftpd)
FTP是网站文件维护中使用比较多的,目前LNMP一键安装包中有Pureftpd和Proftpd服务器安装脚本,LNMP默认不安装任何FTP服务器,需要用户自行安装(1.2开始不再提供proftpd的安 ...
- No input file specified的解决方法apache伪静态
http://jingyan.baidu.com/article/dca1fa6f8d623ff1a44052e8.html (一)IIS Noinput file specified 方法一:改PH ...