作者归档:代码研究所

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盘自动复制指定文件夹下的图片到指定目录 可自行访问下载。

百度webuploader获取文件MD5进度不显示

最近在使用百度开源的webuploader作为文件上传。它有一个功能。就是添加文件的时候可以获取文件的MD5值。这个功能很有效,可以检测文件是否为重复文件。已经存在就不让上传了。当用户选择文件过大时,检查MD5值就需要一会儿,这个时候就想展示给用户一个进度。但是之前有一个问题,总是读取不到。官方文档是这么说的

计算文件 md5 值,返回一个 promise 对象,可以监听 progress 进度。

uploader.on( 'fileQueued', function( file ) {
    var $li = ...;

    uploader.md5File( file )

        // 及时显示进度
        .progress(function(percentage) {
            console.log('Percentage:', percentage);
        })

        // 完成
        .then(function(val) {
            console.log('md5 result:', val);
        });

});

但是开始不知道为什么,percentage总是没有。好像progress这个方法没有运行。后面才发现,JQuery版本的问题!!!!我使用的是JQuery3.X版本。换成JQuery2.X就可以正常显示进度了!。

c++使用easyx实现单文件格子涂色小游戏

使用C++实现的格子涂色小游戏效果如下:

右侧16个格子是颜色选择区。鼠标单机格子可选择颜色。左侧16X13个格子是涂色区。选择颜色后可涂色。可随时切换颜色。

使用easyx图形库

实现思路:

1.先定义两个结构体。一个结构体用来存放涂色区域格子的位置坐标信息。另一个结构体用来存放颜色格子的区域位置坐标信息。颜色格子的结构体需要新增一个成员COLORREF,代表这个格子的颜色

2.定义一个二维数组。里面的每个元素为涂色区域格子。定义一个一维数组,里面存放颜色格子的区域信息。

3.遍历二维数组,使用fillrectangle画出每个涂色区域的格子。遍历一维数组画出每个颜色区域的格子。并且设置对应的颜色。

4.监听鼠标事件。使用peekmessage 非阻塞方法。判断鼠标的点击事件,如果是鼠标左键点击。获取当前鼠标点击的X,Y点。遍历一维数组和二维数组。检查鼠标的X,Y是否在这两个格子区域的X,Y内。如果在就可以判读出是点击的颜色区域还是格子区域。如果是颜色区域,setfillcolor()方法调用对应的颜色即可。如果是涂色区域。fillrectangle()方法画出对应的格子即可。

源代码:

#include<graphics.h>
#include <conio.h>
#include<string.h>

/*
格子涂色小游戏。By:jiangaimin
website: www.jiangaimin.com
*/

#define MAXSECTION 16
#define JUXINGROW 16
#define JUXINGCOLUMN 13
//定义一个颜色矩形部分
typedef struct {
	int left;
	int top;
	int right;
	int bottom;
	COLORREF color;
} ColorSection;



typedef struct {
	int left;
	int top;
	int right;
	int bottom;
} juxing;


//生成颜色格子并填充
void CreateColorSection(ColorSection* colorSection) {
	int colors[] = {
		0,0xAA0000,0x00AA00,0xAAAA00,0x0000AA,0xAA00AA,0x0055AA,
		0xAAAAAA,0x555555,0xFF5555,0x55FF55,0xFFFF55,0x5555FF,
		0xFF55FF,0x55FFFF,0xFFFFFF
	};


	int x = 930, y = 10, ry = 70;
	for (int i = 0; i < MAXSECTION; i++) {
		colorSection[i].left = x;
		colorSection[i].top = y;
		colorSection[i].right = x + 60;
		colorSection[i].bottom = ry;
		colorSection[i].color = colors[i];
		setfillcolor(colorSection[i].color);
		fillrectangle(colorSection[i].left, colorSection[i].top, colorSection[i].right, colorSection[i].bottom);

		y += 60;
		ry += 60;
	}
}

//生成文字
void CreateText() {
	TCHAR str[] = __T("请单击右侧颜色区域选择颜色");
	int x = 850, y = 300;
	int strCount = lstrlenW(str);
	for (int i = 0; i < strCount; i++) {
		outtextxy(x, y, str[i]);
		y += 20;
	}

}

//判断点击区域是颜色格子还是涂色格子
void MouseClick(juxing jx[][JUXINGCOLUMN], ColorSection* colorSection, int x, int y, int* color) {

	//先判断是否是颜色
	for (int i = 0; i < MAXSECTION; i++) {
		int left = colorSection[i].left;
		int right = colorSection[i].right;
		int top = colorSection[i].top;
		int bottom = colorSection[i].bottom;
		if ((x > left && x < right) && (y > top && y < bottom)) {
			*color = colorSection[i].color;
			break;
		}
	}

	for (int i = 0; i < JUXINGROW; i++) {
		for (int j = 0; j < JUXINGCOLUMN; j++) {
			if ((x > jx[i][j].left && x < jx[i][j].right) && (y > jx[i][j].top && y < jx[i][j].bottom)) {
				setfillcolor(*color);
				fillrectangle(jx[i][j].left, jx[i][j].top, jx[i][j].right, jx[i][j].bottom);
				break;
			}
		}
	}

}



//监听鼠标事件,如果点击的范围内是颜色区域。就设置填充的颜色。如果是格子区域,就填充格子
void ListenDraw(juxing jx[][JUXINGCOLUMN], ColorSection* colorSection) {
	ExMessage em;
	int x = 0, y = 0, color = 0;
	while (1) {
		peekmessage(&em, EM_MOUSE);
		switch (em.message) {
		case WM_LBUTTONDOWN:
			x = em.x;
			y = em.y;
			MouseClick(jx, colorSection, x, y, &color);
			break;
		}

	}
}


int main() {

	initgraph(1000, 1000);
	setfillcolor(BLACK);

	int y = 10, ry = 70;
	juxing juxingData[JUXINGROW][JUXINGCOLUMN];

	for (int i = 0; i < JUXINGROW; i++) {
		int x = 10, rx = 70;
		for (int j = 0; j < JUXINGCOLUMN; j++) {
			juxingData[i][j] = { x,y,rx,ry };
			x = rx;
			rx += 60;
		}
		y += 60;
		ry += 60;
	}

	//生成格子
	for (int i = 0; i < JUXINGROW; i++)
		for (int j = 0; j < JUXINGCOLUMN; j++)
			fillrectangle(juxingData[i][j].left, juxingData[i][j].top, juxingData[i][j].right, juxingData[i][j].bottom);

	//生成颜色选择区的格子
	ColorSection colores[MAXSECTION];
	CreateColorSection(colores);
	//创建文字
	CreateText();
	

	while (1) {
		ListenDraw(juxingData, colores);
	}

	closegraph();



	return 0;
}

保存编译,打开即可运行。

批量修改文件编码工具

批量修改文件编码工具是采用C#语言开发。可以选择单个文件。也可以选择文件夹。进行批量处理。转换编码后的文件与原路径一致。为了保险起见。转换前请自行备份一次文件。

选择文件后,在右侧选择原文件的编码、和目标编码。如没有支持的编码,也可以自行输入编码。点击开始转换,即开始转换。待转换完成后提示转换成功即可。

软件运行环境需要.NET FrameWork4.8如没有安装双击软件后即可自动运行安装

ThinkAdmin5任意文件读取工具

ThinkAdmin5是一个使用ThinkPHP框架开发的后台管理系统。现在有V5版和V6版。此工具适用于V5版。可以读取任意文件。要知道后台地址才行。无需登录。

不用工具也是可以直接读取任意文件的,但是要加码解码,手动很麻烦。所以写了这个工具。

目标后台地址必须使用http://或者https://

读取文件支持../来跳上级目录。只要权限够,就可以跨目录读取。

ASP.NET MVC控制器添加基架报错解决

按照微软官方的教程学习ASP.NET CORE MVC,到了添加模型这一步的时候

自动添加基架控制器总是报错:

折腾了好久。后面才发现,出现这个问题实际上就是依赖包的问题。

官方教程让安装Microsoft.EntityFrameworkCore.Design这个包,默认安装后是7.0.5版本。不兼容。解决办法就是直接卸载这个包。然后添加基架就可以了!

ildasm去除受保护模块限制版.exe

使用ildasm反汇编exe或者dll的时候提示受保护模块限制–无法进行反汇编的解决办法:

这是因为对方开发的程序集设置了SuppressIldasmAttribute属性,ildasm这个软件检测到软件有这个属性后就不能打开。

微软官方文档说明:SuppressIldasmAttribute 构造函数 (System.Runtime.CompilerServices) | Microsoft Learn

这里提供一个本人去除ildasm的SuppressIldasmAttribute属性限制下载

把此文件放在和原来的ildasm.exe同一个目录下,双击运行即可。

之前提示受保护的模块现在已经可以正常打开了。

discuz用户组视频播放权限插件

此插件适用于discuz3.4 discuz3.5 discuz3.3,是为了给一个朋友开发的。朋友的一个论坛站点,需要播放视频,但是又不想任何人都可以播放,所以叫我开发一个视频播放权限的插件。插件效果如下:

可以设置开启播放权限的板块(只有选择了的板块才启用)。然后再勾选可以播放视频的用户组。勾选后的用户组才可以播放视频,否则就播放一段无权限的视频。

此插件为本人原创开发,jiangaimin.com插件免费使用,下载后解压到discuz的插件目录,然后后台安装插件即可。

如需要定制开发discuz插件、网站开发、小程序开发也可以联系我

热血封神H5辅助提前进地图升级版

之前发布过热血封神H5的一个挂机辅助,一般的挂机功能都支持了。自动回收、自动熔炼、自动使用经验卷、自动使用元宝、自动合成等等

爱玩之家热血封神H5游戏挂机辅助 – jiangaimin.com

这次带来的是升级版,可以提前进入跨服地图!

现在更新了另一个版本。支持跨服地图传送。这个功能可厉害了,可以提前进入为开放的地图。如下图:支持的跨服地图全部可以进入,部分地图需要中午1点后才能进入。比如圣兽之境,需要开服14天才能进入,使用这个辅助不需要等待14天,开服第一天你也可以进入!

支持一键人物净化,进入圣兽之境之后必须要找到NPC老人才可以净化。此功能只需要点击就可以开启净化!无需找NPC

支持自动提取魂力值:人物四转后需要每天杀怪,每次满5000个必须手动领取。辅助可以支持自动提取魂力值。达到5000自动领取,无需手动点击!

使用效果图:

这次也优化了挂机的一些设置。

如:答题监测功能,挂机久了之后会出现答题,如果没有答题,就会被送到监管之地!此功能通宵挂机时非常有用!注意:此功能是每3分钟检测一次是否有答题,所以可能出现答题的时候软件不会马上自动答题,等三分钟后才会自动答题。如果这时候你自己在电脑前,可以自己答题。不影响软件功能。

经过测试,通宵挂机的时候关闭自动回收元宝,熔炼开启高等级装备熔炼,不要随时去熔炼。可以降低被检测的几率。

使用方法:下载辅助后,双击热血传奇辅助.exe运行,登录游戏账号即可。(此辅助只适用于爱玩之家平台的账号。其它地方注册的账号将会无法登录,需要自己重新注册即可。)

进入游戏后按F8呼出功能菜单,即可使用!

本辅助绿色安全无毒,通过360检测。请放心使用!