19_复制目录下所有文件夹和目录CopyFile()

2023-11-17

复制目录下所有文件夹和目录CopyFile()

想一下,若要复制文件夹,可以在目录位置新建一个文件夹,然后将源文件夹中里面的文件进行遍历,一个一个的复制到目标文件夹中即可。

void EnumCopyFile
(
	/*输入参数*/
	TCHAR* szSrcRootDir, /*需确保,源目录确实存在*/
	TCHAR* szDestRootDir /*需确保,目标目录确实存在*/
)
{
	TCHAR szSrcSearchDir[MAX_PATH];
	TCHAR szSrcDir[MAX_PATH];
	TCHAR szSrcFilePath[MAX_PATH];
	TCHAR szDestPath[MAX_PATH];



	HANDLE hFile;
	DWORD  dwAttrs;
	WIN32_FIND_DATA findFileData; 


	/*针对用户输入的字符串最后有\\ 做的兼容处理*/
	CString szSrcRootDirCstring(szSrcRootDir);
	if (szSrcRootDirCstring.ReverseFind('\\') == szSrcRootDirCstring.GetLength() - 1)
	{
		szSrcRootDirCstring.Delete(szSrcRootDirCstring.GetLength() - 1, 1);
		SecureZeroMemory(szSrcRootDir,sizeof szSrcRootDir);
		StringCchCopy(szSrcRootDir,MAX_PATH,szSrcRootDirCstring.GetBuffer());
	}

	CString szDestRootDirCstring(szDestRootDir);
	if (szDestRootDirCstring.ReverseFind('\\') == szDestRootDirCstring.GetLength() - 1)
	{
		szDestRootDirCstring.Delete(szSrcRootDirCstring.GetLength() - 1, 1);
		SecureZeroMemory(szDestRootDir, sizeof szDestRootDir);
		StringCchCopy(szDestRootDir, MAX_PATH, szDestRootDirCstring.GetBuffer());
	}

	


	//以全通配形式做文件遍历
	StringCchCopy(szSrcSearchDir, MAX_PATH, szSrcRootDir);
	StringCchCopy(szSrcDir, MAX_PATH, szSrcRootDir);
	StringCbCat(szSrcSearchDir, MAX_PATH * sizeof(TCHAR), _T("\\*.*"));
	
	hFile = FindFirstFile(szSrcSearchDir, &findFileData); 
	if (hFile == INVALID_HANDLE_VALUE)
		return;

	do
	{
		if (!_tcscmp(_T("."), findFileData.cFileName) || !_tcscmp(_T(".."), findFileData.cFileName))
			continue; 


		if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //这是一个目录,递归入口..做文件复制.
		{
			TCHAR szSubSrcDir[MAX_PATH] = { 0 };
			StringCchCopy(szSubSrcDir, MAX_PATH, szSrcRootDir);
			StringCchPrintf(szSubSrcDir, sizeof(szSubSrcDir) / sizeof(szSubSrcDir[0]), _T("%s\\%s"), szSubSrcDir, findFileData.cFileName);

			TCHAR szSubDestDir[MAX_PATH] = { 0 };
			StringCchCopy(szSubDestDir,MAX_PATH, szDestRootDir);
			StringCchPrintf(szSubDestDir,sizeof(szSubDestDir)/sizeof(szSubDestDir[0]),_T("%s\\%s"), szSubDestDir, findFileData.cFileName);

			CreateDirectory(szSubDestDir,NULL); //FILE_FLAG_BACKUP_SEMANTICS 创建子目录
			EnumCopyFile(szSubSrcDir, szSubDestDir);
		}
		else
		{
			SecureZeroMemory(szDestPath, sizeof szDestPath);
			SecureZeroMemory(szSrcFilePath, sizeof szSrcFilePath);

			//构造目标文件路径
			StringCchPrintf(szDestPath, sizeof(szDestPath) / sizeof(szDestPath[0]), _T("%s\\%s"), szDestRootDir, findFileData.cFileName);

			//构造源文件路径
			StringCchCopy(szSrcFilePath, MAX_PATH, szSrcDir);
			StringCchPrintf(szSrcFilePath, sizeof(szSrcFilePath) / sizeof(szSrcFilePath[0]), _T("%s\\%s"), szSrcRootDir, findFileData.cFileName);


			if (CopyFile(szSrcFilePath, szDestPath, FALSE))
			{
				//复制完成后,如果不是只读的,则更新文件属性为只读
				dwAttrs = GetFileAttributes(findFileData.cFileName);

				if (dwAttrs != INVALID_FILE_ATTRIBUTES)
				{
					if (!(dwAttrs & FILE_ATTRIBUTE_READONLY))
					{
						SetFileAttributes(szDestPath, FILE_ATTRIBUTE_READONLY);
					}
				}
			

			}
		}

	} while (FindNextFile(hFile, &findFileData));


	FindClose(hFile);


}


int _tmain(int argc,TCHAR* argv)
{

	TCHAR* target_dir = _T("D:\\copyDestDirectory");
	TCHAR ugii_root_dir[50] = {0};
	GetEnvironmentVariable(_T("UGII_ROOT_DIR"), ugii_root_dir,50); 
	

	CreateDirectory(_T("D:\\copyDestDirectory"), NULL);
	EnumCopyFile(ugii_root_dir, target_dir);

	return 0;
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

19_复制目录下所有文件夹和目录CopyFile() 的相关文章

随机推荐

  • 中国货币超发严重 去年新增货币占全球近一半

    提要 2009年以来 中国已成为目前全球最大的 印钞机 2012年 全球新增货币供应量中国占近一半 21世纪网评估发现 均衡人均收入差异后 中国的经济货币化程度高居全球前列 截至2012年末 中国M2余额达到人民币97 42万亿元 居世界第
  • JS考点

    JavaScript 1 原始值和引用值类型及区别 原始值即存在栈中的数据 包含symbol number string null undefined boolean类型 引用值即存在堆中的对象 对象地址 指针 存在栈中 指向堆中存储的数据
  • 2021-07-25

    神经网络 M P神经元 感知机 感知机 神经网络 M P神经元 1 M P神经元 模拟生物行为的数学模型 接手n个输入 来自其他的神经元 并给各个输入赋予权重计算加权和 再跟自己特有的阀值 比较 通常用减法 最后经过激活函数 模拟 抑制 和
  • Stable Diffusion Base Model from safetensors transfer to diffusers

    Steps File Setup Clone the ControlNet model repo from HF into a folder like hf controlnet model git clone https huggingf
  • Qt 中父子关系使用总结

    背景 Qt 中到父子关系和类的继承无关 仅表示对象间到从属关系 继承自 QObject 的对象在构造时需要指定父对象指针 include
  • 计算机基础知识+Java语言基础 +JAVA学习笔记-DAY01

    计算机基础知识 01 01 计算机概述 了解 A 什么是计算机 计算机在生活中的应用举例 计算机 Computer 全称 电子计算机 俗称电脑 是一种能够按照程序运行 自动 高速处理海量数据的现代化智能电子设备 由硬件和软件所组成 没有安装
  • Cent OS6.5 安装nodeJS(分分钟搞定)

    第一步 下载 cd opt wget https nodejs org dist v7 5 0 node v7 5 0 linux x64 tar xz 第二步 解压缩文件包 xz d node v7 5 0 linux x64 tar x
  • hive原理与源码分析-hive源码架构与理论(一)

    什么是Hive 数据仓库 存储 查询 分析大规模数据 SQL语言 简单易用的类SQL查询语言 编程模型 允许开发者自定义UDF Transform Mapper Reducer 来更简单地完成复杂MapReduce无法完成的工作 数据格式
  • 运放增加输出电流

    功率输出模块 采用三极管9012 9013来进行双向扩流以提高其带载能力 可以完全满足发挥部分所要求的稳幅输出能力 当负载变化时 其输出电压幅度变化小于3 如图所示 集成运放的扩流和扩压 一 集成运放的扩流 在集成运放的输出端再加一级互补对
  • k8s-client(java)从6.0.1升级到11.0.0出现patch问题may not be specified for non-apply patch/cannot unmarshal...

    背景 kubernetes client java升级 复杂的patch出现各种问题 并且没有找到解决方案 经过研究 测试 找到了解决方案 希望能帮助到使用kubernetes client java客户端的同学 patch方法调用出现异常
  • IEEE 1471(ISO/IEC/IEEE 42010)架构描述方法

    ISO IEC IEEE 42010 架构描述方法 关于 背景 架构描述 利益相关者和关注点 架构视图和架构观点 架构模型 架构关系 架构原理 关于 本文对软件体系架构的描述方法的研究基于 ISO IEC IEEE 42010 ISO IE
  • unity ethan_响应式网页设计的挑战,Ethan Marcotte

    unity ethan In this episode of the Versioning Show David and Tim are joined by Ethan Marcotte a well known designer who
  • c语言设计(TVI)地铁自动售票机---@颜麓

    设计TVI 地铁自动售票机 机软件 输入站数 计算费用 计费规则 6站2元 7 10站3元 11站以上为4元 输入钱数 计算找零 找零时优先找回面额大的钞票 找零方式为各种面额张数 可识别面额 100 50 20 10 5 1 includ
  • Sentinel整合Ribbon/OpenFeign,Sentinel自定义限流熔断

    Sentinel服务熔断环境搭建 服务熔断 应对微服务雪崩效应的一种链路保护机制 类似保险丝 需要完成Sentinel整合Ribbon openFeign 所以我们先要搭建环境 那么先从整合Ribbon开始 环境搭建 为了演示操作 所以在这
  • DBeaver改成英语

    DBeaver改成英语 安装目录中有个dbeaver ini文件 追加 Duser language en可以改回英文 有些数据库术语翻译后反而不太容易理解
  • java获取唯一时间戳Id.多线程保证唯一性

    工程里有获取唯一时间戳作为id的需求 想了想用乐观锁cas实现 自旋 cas原子性操作获得了绝对唯一的时间戳 系统时间 纳秒版本 单机有效 不能分布式调用 public class AtomicTimeStamp private Atomi
  • Anaconda的安装与环境配置

    这里简单的记录一下Anaconda的安装过程 没有干货 只是记录 但也看了就会 下载安装包 这里有两个下载地址 分别是官网和清华镜像源 推荐清华镜像 下的快 官网下半天还可能失败 无论是哪个下载地址 找到对应你系统的安装程序下载即可 官网
  • Ubuntu下安装JDK图文教程详解

    操作系统 Ubuntu 11 10 我们选择的是jdk1 6 0 30版本 安装文件名为jdk 6u30 linux i586 bin 1 复制jdk到安装目录 1 假设jdk安装文件在桌面 我们指定的安装目录是 usr local jav
  • 可以编辑的table antd

    版本一 效果图 有保存按钮 antd3 代码 import React Component from react import Form Input Button Table Divider Popconfirm Tooltip from
  • 19_复制目录下所有文件夹和目录CopyFile()

    复制目录下所有文件夹和目录CopyFile 想一下 若要复制文件夹 可以在目录位置新建一个文件夹 然后将源文件夹中里面的文件进行遍历 一个一个的复制到目标文件夹中即可 void EnumCopyFile 输入参数 TCHAR szSrcRo