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 ...
随机推荐
- (๑•̀ㅂ•́)و✧随笔总目录ヾ(≧▽≦*)o
SSM整合进阶篇 日常手记 开源博客My Blog系列 短信接口攻击事件 读书笔记 SSM整合优化篇 SSM整合基础篇 SSM整合进阶篇 Spring+SpringMVC+MyBatis+easyUI ...
- MYBATIS常用的sql事例
今天整理了一下在项目中经常用到的mybatis的xml文件的sql语句: 读者:有sql基础. <?xml version="1.0" encoding="UTF- ...
- 《SpringMVC从入门到放肆》一、概述
一.SpringMVC概述 View Service Dao DB Spring MVC interface interface Mysql impls impls SpringMVC也叫Spring ...
- jQuery_serialize的用法
jQuery_serialize(form表单序列化)用于在前端要传很多值往后端的时候: <!DOCTYPE html> <html lang="en"> ...
- 我的第一个网页制作:Hello World!
这是我花了一个晚上搞的一个Hello World!也只会Hello World!慢慢学,要努力成为大神(黑客专家) 下面给出HTML代码: <html> <head> < ...
- XYZZY(spfa求最长路)
http://acm.hdu.edu.cn/showproblem.php?pid=1317 XYZZY Time Limit: 2000/1000 MS (Java/Others) Memor ...
- 重新学习一次javascript;
每次有项目的时候,总觉得自己什么都不会做,然后做的时候又很简单,一会就做完了,啪啪打脸: 每次别人问的时候,我知道怎么做,但是不知道具体原理,觉得瞬间low了: 想要好好的吧基础掌握一下: 这几天空闲 ...
- 在.Net中将RocketMQ跑起来_入门篇【2】
上一篇讲了如何再控制台将RocketMQ跑起来,本篇讲解,在asp.net mvc种跑起来,含(发布.订阅). 本次将不挨个贴源码,直接展示目录,根据上一篇文章,进行相应的调整即可. 1.新建一个类库 ...
- js keys方法和foreach方法区别
keys和foreach都有遍历对象的功能,但他们可以遍历的对象类型是不一样的,foreach是数组对象的方法,而keys是Object对象的方法.换句话说,foreach只能数组对象使用,而keys ...
- Redis Cluster集群搭建与应用
1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结 ...