C++使用win32实现插入U盘自动复制文件到指定文件夹

今天收到一个朋友的需求,刚开始也说的模模糊糊,我也没听明白。后来我大概已经了解了。这朋友的朋友是做摄影的,相机拍照后会有很多图片文件。每次都要手动的从相机存储卡里复制图片文件到指定的D:/XX博物馆/临时/2/ 这个文件夹下。并且还要把图片文件名重新整理一下。每次都要手动操作,所以找我帮忙写个自动化的。

大概需求就是:插入U盘(或者存储卡)将DCIM文件夹下面的,所有包含CANON这种文件夹下面的所有图片文件。全部拷贝到目标文件夹D:/XX博物馆/临时/2/ DCIM文件夹下会有0001CANON,或者0002CANON这样的文件夹存在。大概就是这样

像222这种文件夹就直接忽略掉。

然后呢,CANON这种文件夹下的图片名称是这样的:

需要去掉IMG_。只保留000.jpg 0001.jpg这样的。并拷贝到D盘目标目录下。

需求了解清楚了,就大概说下实现过程。首先看下软件:

软件使用C++ Win32 API编写,独立一个EXE。双击即可运行,不需要任何额外环境。然后插入U盘,程序会自动识别U盘是否插入成功,自动识别盘符。并且识别到插入后。就立即自动拷贝文件。

拷贝完成,一共四个文件。111CANON文件夹下有3个。222CANON文件夹下有1个。一共4个,并且按照需要的命名规则然后拷贝。成功。

首先创建一个windows桌面窗口程序。然后监听消息,如果是:WM_DEVICECHANGE消息,说明磁盘改变了,就根据消息参数判断是插入的什么。

根据dbch_devicetype的类型判断磁盘是否是新增卷。是就获取U盘盘符,因为插入的U盘盘符是会更改的。根据dbcv_unitmask成员是一个4字节的整数。判断它的位数。0位为1就是A,1位为1就是B以此类推。下面是个人使用的笨办法获取盘符函数。

wchar_t GetPanFu(DWORD unitmask) {
	wchar_t panfu = 'F';
	switch (unitmask) {
	case 0:
		panfu = 'A';
		break;
	case 2:
		panfu = 'B';
		break;
	case 4:
		panfu = 'C';
		break;
	case 8:
		panfu = 'D';
		break;
	case 16:
		panfu = 'E';
		break;
	case 32:
		panfu = 'F';
		break;
	case 64:
		panfu = 'G';
		break;
	case 128:
		panfu = 'H';
		break;
	case 256:
		panfu = 'I';
		break;
	case 512:
		panfu = 'J';
		break;
	case 1024:
		panfu = 'K';
		break;
	default:
		panfu = NULL;
		break;
	}
	return panfu;
}

最多只获取到了K盘,因为我觉得一般来说没那么多盘。想要再多盘再自己新增CASE规则即可。

拿到盘符,就是遍历文件夹了。使用的WIN32 API FindFirstFile函数,搜索文件。先判断DCIM文件夹是否存在。存在在进行下一步。否则直接提示DCIM文件夹不存在。然后接着遍历DCIM文件夹下包含CANON的文件夹名称。存放到数组中。然后再遍历这个数组下的所有图片文件。调用Copyfile函数复制文件即可!

源代码我已上传到代码空间
C++使用WIN32插入U盘自动复制指定文件夹下的图片到指定目录 可自行访问下载。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注