在Windows下使用MFC/Win32 API进行文件夹内所有文件的复制操作,可以通过遍历目录中的文件并逐个复制来实现

news2024/10/21 3:17:31

系列文章目录

文章目录

  • 系列文章目录
  • 前言

前言

在Windows下使用MFC/Win32 API进行文件夹内所有文件的复制操作,可以通过遍历目录中的文件并逐个复制来实现。以下是一个简单的示例,代码设计用于递归复制整个目录结构,而您的需求是复制一个特定的文件(Game.locres)到另一个目录。当前代码尝试复制整个Game目录及其子目录,而不是单独的文件。因此,当尝试递归进入不存在的子目录时(例如Game\Game),程序会失败。

为了仅复制特定文件,您需要修改代码以直接处理文件而不是目录。以下是修改后的代码示例,它将只复制Game.locres文件到目标目录:

初始化变量
WIN32_FIND_DATA findData 存储查找结果的数据结构。
HANDLE hFind 存储查找句柄。
wchar_t szFullSrcPath[MAX_PATH] 和 wchar_t szFullDstPath[MAX_PATH] 分别用于构造完整的源路径和目标路径。
构建通配符搜索字符串
wcscpy_s(szFullSrcPath, pszSrcDir); 将源目录路径复制到 szFullSrcPath。
wcscat_s(szFullSrcPath, L"\*"); 在路径后面加上通配符 *,表示查找所有文件。
查找第一个文件
hFind = FindFirstFile(szFullSrcPath, &findData); 使用 FindFirstFile 函数查找第一个文件。
如果 hFind 返回 INVALID_HANDLE_VALUE,表示查找失败,直接返回 false。
遍历文件和目录
使用 do…while 循环遍历所有文件。
wcscmp 比较文件名,跳过当前目录 (.) 和父目录 (…)。
构造完整的源路径和目标路径。
如果是目录,则递归调用 CopyFolder 函数复制整个目录树。
如果是文件,则使用 SHFileOperation 函数复制单个文件。
FOF_NOCONFIRMATION 表示不提示用户确认,FOF_SILENT 表示静默操作。
关闭查找句柄
FindClose(hFind); 关闭查找句柄。
返回值
如果所有操作成功,返回 true;否则返回 false。

#include <windows.h>
#include <Shlobj.h>
#include <wchar.h>
#include <iostream> // 用于控制台输出

// 函数声明
bool CopyFolder(const wchar_t* pszSrcDir, const wchar_t* pszDstDir);

int wmain()
{
	//wchar_t szSrcDir[MAX_PATH];
	//wchar_t szDstDir[MAX_PATH];

	 使用常量路径代替输入
	//const wchar_t* pszSrcDir = L"E:\\soui\\LocationalTool\\Localization\\";
	//const wchar_t* pszDstDir = L"E:\\soui\\LocationalTool\\dest\\";

	//if (CopyFolder(pszSrcDir, pszDstDir))
	//	wprintf(L"Directory copied successfully.\n");
	//else
	//	wprintf(L"Failed to copy directory.\n");

	//return 0;
	const wchar_t* pszSrcFile = L"E:\\soui\\LocationalTool\\Localization\\Game\\en\\Game.locres";
	const wchar_t* pszDstDir = L"E:\\soui\\LocationalTool\\dest\\";

	wchar_t szDstFile[MAX_PATH];
	wcscpy_s(szDstFile, pszDstDir);
	wcscat_s(szDstFile, L"Game.locres");

	if (CopyFileW(pszSrcFile, szDstFile, FALSE))
		wprintf(L"File copied successfully.\n");
	else
	{
		DWORD dwError = GetLastError();
		wprintf(L"Failed to copy file. Error: %lu\n", dwError);
	}

	return 0;
}

bool CopyFolder(const wchar_t* pszSrcDir, const wchar_t* pszDstDir)
{
	WIN32_FIND_DATA findData;
	HANDLE hFind = INVALID_HANDLE_VALUE;
	wchar_t szFullSrcPath[MAX_PATH];
	wchar_t szFullDstPath[MAX_PATH];

	// 构建通配符搜索字符串
	wcscpy_s(szFullSrcPath, pszSrcDir);
	wcscat_s(szFullSrcPath, L"*");

	// 检查源目录是否存在
	DWORD dwAttrib = GetFileAttributesW(pszSrcDir);
	if (dwAttrib == INVALID_FILE_ATTRIBUTES) {
		DWORD dwError = GetLastError();
		wprintf(L"Failed to get attributes for '%ls'. Error: %lu\n", pszSrcDir, dwError);
		return false;
	}
	if (!(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) {
		wprintf(L"Source path '%ls' is not a directory.\n", pszSrcDir);
		return false;
	}

	// 创建目标目录
	if (!::CreateDirectoryW(pszDstDir, NULL) && GetLastError() != ERROR_ALREADY_EXISTS) {
		DWORD dwError = GetLastError();
		wprintf(L"Failed to create destination directory '%ls'. Error: %lu\n", pszDstDir, dwError);
		return false;
	}

	// 查找第一个文件
	hFind = FindFirstFile(szFullSrcPath, &findData);
	if (hFind == INVALID_HANDLE_VALUE) {
		DWORD dwError = GetLastError();
		wprintf(L"Failed to find files in '%ls'. Error: %lu\n", pszSrcDir, dwError);
		return false;
	}

	do {
		// 跳过"." 和 ".." 目录
		if (wcscmp(findData.cFileName, L".") != 0 &&
			wcscmp(findData.cFileName, L"..") != 0) {

			wprintf(L"Processing '%ls'\n", findData.cFileName); // 输出正在处理的文件/目录

			wcscpy_s(szFullSrcPath, pszSrcDir);
			wcscat_s(szFullSrcPath, L"\\");
			wcscat_s(szFullSrcPath, findData.cFileName);

			wcscpy_s(szFullDstPath, pszDstDir);
			wcscat_s(szFullDstPath, L"\\");
			wcscat_s(szFullDstPath, findData.cFileName);

			// 如果是目录,则递归复制
			if ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
				wprintf(L"Recursive call for directory '%ls'\n", szFullSrcPath); // 输出递归调用信息
				if (!CopyFolder(szFullSrcPath, szFullDstPath))
					return false;
			}
			else { // 否则复制文件
				SHFILEOPSTRUCT fileOp = { 0 };
				fileOp.wFunc = FO_COPY;
				fileOp.pFrom = szFullSrcPath;
				fileOp.pTo = szFullDstPath;
				fileOp.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;

				if (!SHFileOperation(&fileOp)) {
					DWORD dwError = GetLastError();
					wprintf(L"Failed to copy file '%ls' to '%ls'. Error: %lu\n", szFullSrcPath, szFullDstPath, dwError);
					return false;
				}
			}
		}
	} while (FindNextFile(hFind, &findData));

	FindClose(hFind);
	return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2219748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java面试指南:Java基础介绍

这是《Java面试指南》系列的第1篇&#xff0c;本篇主要是介绍Java的一些基础内容&#xff1a; 1、Java语言的起源 2、Java EE、Java SE、Java ME介绍 3、Java语言的特点 4、Java和C的区别和联系&#xff1f; 5、面向对象和面向过程的比较 6、Java面向对象的三大特性&#xff1a…

云计算-----单机LNMP结构WordPress网站

LNMP结构 博客网站 day1 小伙伴们&#xff0c;LNMP结构在第一二阶段浅浅的学习过&#xff0c;这里我们可以离线部署该结构。L指&#xff08;虚拟机&#xff09;服务器&#xff0c;nginx&#xff08;前端代理服务器&#xff09;mysql数据库&#xff0c;最后基于php建设动态…

AlDente Pro for Mac电脑 充电限制保护工具 安装教程【简单,轻松上手】

Mac分享吧 文章目录 AlDente Pro for Mac 充电限制保护工具 安装完成&#xff0c;软件打开效果一、AlDente Pro for Mac 充电限制保护工具 Mac电脑版——v1.28.41️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件&#xff0c;将安装包从左侧拖入右侧文件夹中&#xff0c;等…

Halcon实战——基于NCC模板匹配的芯片检测(附源码)

Halcon实战——基于NCC模板匹配的芯片检测&#xff08;附源码&#xff09; 关于作者 作者&#xff1a;小白熊 作者简介&#xff1a;精通python、matlab、c#语言&#xff0c;擅长机器学习&#xff0c;深度学习&#xff0c;机器视觉&#xff0c;目标检测&#xff0c;图像分类&am…

Java | Leetcode Java题解之第493题翻转对

题目&#xff1a; 题解&#xff1a; class Solution {public int reversePairs(int[] nums) {Set<Long> allNumbers new TreeSet<Long>();for (int x : nums) {allNumbers.add((long) x);allNumbers.add((long) x * 2);}// 利用哈希表进行离散化Map<Long, Int…

linux 效率化 - 输入法 - fcitx5

安装 Fcitx5 1. 卸载 ibus 框架 由于 ibus 和 fcitx 可能会冲突&#xff0c;先卸载 ibus&#xff08;暂未确认原因&#xff09; sudo apt remove --purge ibus2. 安装 fcitx5 输入法框架 sudo apt update sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-frontend-gtk…

深入理解Nest的REQUEST范围和TRANSIENT范围

深入理解Nest的REQUEST范围和TRANSIENT范围 单例模式REQUEST范围控制器的REQUEST范围REQUEST范围的冒泡特性场景 TRANSIENT范围例外场景 总结 单例模式 单例模式是指在整个程序执行期间&#xff0c;程序内的类都会实例化&#xff0c;且与应用程序生命周期直接相关&#xff0c;…

javax.el.PropertyNotFoundException: Property ‘XXX‘ not found on type XXX(类的路径)

捣鼓了半小时的bug 在网上找了好多方案,都没有解决 其中一个佬的解决方案:异常&#xff1a;javax.el.PropertyNotFoundException: Property xxx not found on type java.lang.String-CSDN博客 但是还是没有解决我的问题 最终解决方法,在jsp文件头部导入了类包(第三行我导入…

【Nginx系列】Nginx配置超时时间

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

MySQL日期类型选择建议

我们平时开发中不可避免的就是要存储时间&#xff0c;比如我们要记录操作表中这条记录的时间、记录转账的交易时间、记录出发时间、用户下单时间等等。你会发现时间这个东西与我们开发的联系还是非常紧密的&#xff0c;用的好与不好会给我们的业务甚至功能带来很大的影响。所以…

深入拆解TomcatJetty(二)

深入拆解Tomcat&Jetty&#xff08;二&#xff09; 专栏地址&#xff1a;https://time.geekbang.org/column/intro/100027701 1、Tomcat支持的IO模型和应用层协议 IO模型&#xff1a; NIO&#xff1a;非阻塞 I/O&#xff0c;采用 Java NIO 类库实现。NIO2&#xff1a;异…

Cyber RT 之 Timer Component 实践(apollo 9.0)

实验内容 Component 是 Cyber RT 提供的用来构建功能模块的基础类&#xff0c;Component 有两种类型&#xff0c;分别为 Component 和 TimerComponent。 相较于 Component&#xff0c;TimerComponent 不提供消息融合&#xff0c;也不由消息触发运行&#xff0c;而是由系统定时…

UE5 gameplay学习 蓝图0 level blueprint

首先在左上角这个位置可以创建一个这个蓝图 我理解这个蓝图适合做全局事件规划啥的 在场景选中一个物体&#xff0c;右侧面板拿到他&#xff0c;直接拖入蓝图&#xff0c;就能操作他了 这里获取到了这个物体&#xff0c;在gamebegin的时候把Z加了500 执行播放的时候能看见他从…

Windows API 一 ----起步

目录 1.介绍主函数入口参数。 2. 简单介绍 Windows.h 这个头文件 小结&#xff0c;也聊一聊 1.介绍主函数入口参数。 第一个参数: HINSTANCE 类型的 参数&#xff0c; 称为“实例句柄“&#xff0c;这个参数唯一标志了我们写的这个程序。 第二个参数&#xff1a; HINSTANCE…

poisson过程——随机模拟(Python和R实现)

Python实现 exponential()使用&#xff0c;自动poisson过程实现。 import numpy as np import matplotlib.pyplot as plt# Parameters lambda_rate 5 # rate parameter (events per time unit) T 10 # total time# Generate Poisson process times np.random.exponential(…

k8s系列-Rancher 上操作的k8s容器网络配置总结

Rancher 上操作的k8s容器网络配置总结 要在 Rancher 中配置Spring Boot 应用 ykhd-zhjgyw-xpwfxfjfl 服务&#xff0c;正确的配置方式如下&#xff1a; 1. 应用程序监听端口 在 application.yaml 文件中&#xff0c;配置的应用监听端口是 10001&#xff0c;并且应用的上下文…

Mycat 详细介绍及入门实战,解决数据库性能问题

一、基本原理 1、数据分片 &#xff08;1&#xff09;、水平分片 Mycat 将一个大表的数据按照一定的规则拆分成多个小表&#xff0c;分布在不同的数据库节点上。例如&#xff0c;可以根据某个字段的值进行哈希取模&#xff0c;将数据均匀的分布到不同的节点上。 这样做的好处…

美摄科技云服务解决方案,方案成熟,接入简单

美摄科技作为视频处理领域的先锋&#xff0c;凭借其强大的技术实力和深厚的行业经验&#xff0c;推出了成熟的云服务解决方案&#xff0c;为轻量化视频制作开辟了全新的道路。 一、成熟方案&#xff0c;接入无忧 美摄科技云服务解决方案的最大亮点在于其成熟度和易用性。我们…

RabbitMQ 入门(四)SpringAMQP五种消息类型(Work Queue)

一、WorkQueue(工作消息队列) Work queues&#xff0c;也被称为&#xff08;Task queues&#xff09;&#xff0c;任务模型。简单来说就是让多个消费者绑定到一个队列&#xff0c;共同消费队列中的消息。 当消息处理比较耗时的时候&#xff0c;可能生产消息的速度会远远大于…

react里实现左右拉伸实战

封装组件&#xff1a; 新建一个resizeBox.tsx文件写上代码如下&#xff1a; import React, { ReactNode, useState, useEffect, useRef } from react; import styles from "./resizeBox.less"; interface ResizableBoxProps {/*** 盒子的宽度*/widthNum?: number;…