vc复制文件夹实现(可以复制三层路径)以及zip压缩实现

#include <boost\filesystem.hpp>
#include <KHAboutLocalEnvirTool.h>
#include <string>
#include "XZip.h"

//复制文件夹实现
void copy_all_file(LPCSTR file_path, std_string &backup_path) //第一个参数为被复制文件,第二个是复制到的地址
{
	if(!(boost::filesystem::exists(backup_path.c_str())))//判断备份文件的目录是否存在,不存在则创建
	{
		boost::filesystem::create_directory(backup_path.c_str());//目录不存在,创建
	}  

	std::vector< std_string > file_list ;
	std_string path(file_path);
	path.Append("\\");
	file_list(file_path, file_list );//获取文件列表,通过findfirstfile实现
	for ( auto it = file_list.begin(); it != file_list.end() ; it++ )
	{
		std_string file_name = (*it);//文件路径
		std_string file_path_str;
		file_path_str.Assign(file_name.c_str());
		file_name.Replace(path.c_str(), "");//数据库文件名

		std_string copyfile_path,copyfile_dir;
		copyfile_dir.Append(backup_path.c_str());
		copyfile_dir.Append(file_name.c_str());
		copyfile_path.Assign(copyfile_dir.c_str());
		copyfile_dir.erase(copyfile_dir.rfind("\\"), copyfile_dir.size());
		if(!(boost::filesystem::exists(copyfile_dir.c_str())))
		{
			boost::filesystem::path dir_pa(copyfile_dir.c_str());
			dir_pa = dir_pa.parent_path();
			if (!boost::filesystem::exists(dir_pa))
			{
				boost::filesystem::create_directory(dir_pa);//父目录不存在就创建
			}
			boost::filesystem::create_directory(copyfile_dir.c_str());//目录不存在就创建
		}
		CopyFileA(file_path_str.c_str(),copyfile_path.c_str(), TRUE );
	}
}

//zip文件压缩实现
HZIP hz_res_value = CreateZip(CA2T(file_path.c_str()), 0 , ZIP_FILENAME);
if ( hz_res_value )
{
	std::vector< std_string > file_list ;
	file_list(backup_dir_path.c_str(), file_list );

	for ( auto it = file_list.begin(); it != file_list.end() ; it++ )
	{
		std_string file_name = (*it);//文件路径
		file_name.Replace(path_str.c_str(), "");//数据库文件名,ptr为其父路径
		ZRESULT zRet = ZipAdd( hz_res_value, CA2T(file_name.c_str()), CA2T((*it).c_str()), NULL, ZIP_FILENAME );
	}
	CloseZip( hz_res_value );
}

void file_list(LPCSTR szPath, std::vector< std_string > & flist )
{
	if (szPath == NULL)
	{
		return;
	}

	WIN32_FIND_DATAA FindFileData;
	HANDLE hListFile;
	CHAR szFilePath[MAX_PATH] = { 0 };

	std_string str_file_path(szPath);
	if (!str_file_path.EndsWith("\\"))
	{
		str_file_path.push_back('\\');
	}
	std::string new_dir = szPath;
	str_file_path.push_back('*');
	//查找第一个文件/目录,获得查找句柄
	hListFile = FindFirstFileA(str_file_path.c_str(), &FindFileData);
	//判断句柄
	if (hListFile == INVALID_HANDLE_VALUE)
	{
		return;
	}
	else
	{
		do
		{
			if (strcmp(FindFileData.cFileName, ".") == 0 || strcmp(FindFileData.cFileName, "..") == 0)
			{
				continue;
			}
			std::string _new_dir = new_dir +"\\"+ FindFileData.cFileName;
			//判断文件属性,目录
			if (FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
			{
				file_list(_new_dir.c_str(), flist);
				//RemoveDirectoryA(_new_dir.c_str());
			}
			else
			{
				flist.push_back(_new_dir.c_str());
			}
			//读者可根据文件属性表中的内容自行添加判断文件属性。

		} while (FindNextFileA(hListFile, &FindFileData));
	}
	FindClose(hListFile);
	return;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-16 10:21:26

vc复制文件夹实现(可以复制三层路径)以及zip压缩实现的相关文章

VC中文件(夹)目录与路径操作原理与代码实现

***********************************************声明************************************************************************************* 原创作品,出自 "晓风残月xj" 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj). 由于各种原因,可能存在诸多不足,欢迎斧正! ************

PHP 查看文件夹大小、复制文件夹、删除文件夹

PHP虽然提供了 filesize.copy.unlink 等文件操作的函数,但是没有提供 dirsize.copydir.rmdirs 等文件夹操作的函数(rmdir也只能删除空目录).所以只能手动编写这些函数,主要的技巧是通过递归将问题逐层分解,直到分解成可以直接解决的最小子问题. ====================查看文件夹大小===================== 由于文件夹是没有大小的,平常所说的文件夹尺寸准确的说应该是文件夹中所有文件的总大小.所以只需要将文件夹逐层查找,统

node复制文件夹,压缩zip,上传

一:用到的模块和简单介绍 npm文档:request :node请求的模块,可以给用程序请求服务器的接口https://www.npmjs.com/package/requestfs:读写文件的,很常用https://www.npmjs.com/package/fspath:路径,各种给文件夹弄路径什么的https://www.npmjs.com/package/pathjs-cookie:获取cokie的,在请求的时候需要用到https://www.npmjs.com/package/js-c

java复制文件夹及所有子目录和文件

package text; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStrea

使用IO流对文件夹的复制(文件夹中带有子目录)

当我们要复制带有子目录的文件夹的时候,就必须使用递归,这样才能把全部的文件夹都复制到位 思路和步骤: 对于文件夹的复制,分2种情况               (1)当我们对文件进行遍历的时候,如果目标文件夹下的文件是个标准文件的话,我们就可以直接去做复制的动作,               (2)当目标文件中,是带有文件夹的文件,那么这个时候就需要对文件夹进行递归,直到最后它是个标准文件后,我们在做复制动作 有了上述的2种情况后,那么这个需求,需要提供2种方法,1是对标准文件的复制,2是对带有

C# 压缩 解压 复制文件夹

命名空间:namespace System.IO.Compression 压缩: //目标文件夹 string fileDirPath = "/Downloads/试题" + userId + "_" + courseId; string downPath = Server.MapPath(fileDirPath); if (!Directory.Exists(downPath)) { Directory.CreateDirectory(downPath); } S

复制文件夹中所有内容到指定位置

复制文件夹中所有内容到指定位置 /** * 复制文件夹下的所有文件到指定目录 * @param oldPath * @param newPath */ public static void copyFolder(String oldPath, String newPath) { try { // 如果文件夹不存在,则建立新文件夹 (new File(newPath)).mkdirs(); //读取整个文件夹的内容到file字符串数组,下面设置一个游标i,不停地向下移开始读这个数组 File fi

JAVA实现复制文件夹

1 package com.filetest; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileOutputStream; 8 import java.io.IOException; 9 import java.util.Scanne

javaIo——运用字节流完整复制文件夹及文件

突发奇想要写一段全部复制文件夹的代码,可以复制一个文件夹到任何目录(包括盘符根目录或者文件夹根目录),感觉自己写的很冗余,新手希望大牛指点一下! public class Test { int a = 0; static File startPath = null; static File endPath = null; public static void main(String[] args) throws IOException { Scanner input = new Scanner(