C语言实现获取WIN10自动更新的锁屏壁纸

WIN10的锁屏会定期自己更新锁屏壁纸,有些壁纸还是蛮好看的,可惜win10的锁屏壁纸缓存目录藏得挺深的,而且文件名都是没有后缀名的乱码(其实就是jpg文件,只不过缓存时没有加上后缀名),有时看到喜欢的锁屏壁纸想用来当桌面壁纸,还要点无数下鼠标到缓存文件夹,然后给文件一个个加上jpg后缀名来查找对应的壁纸文件。

为了一劳永逸的解决壁纸问题,顺带练练手,于是我写了下面这个程序,此程序会自动搜寻锁屏壁纸缓存目录内的缓存文件,并将壁纸文件添加jpg后缀名后复制到 我的文档的图像文件夹内。,此代码在VS2017下编译正常。

第一版代码

#include <stdio.h>
#include <stdlib.h>
#include <direct.h>
#include <io.h>
#include <string.h>

//修改此宏定义来指定锁屏壁纸缓存文件的所在路径(一般只需要将 water 替换为你自己的用户名就行了)
#define SCREEN_PICTURE_DIR \		
"C:\\Users\\water\\AppData\\Local\\Packages\\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\\LocalState\\Assets\\"

//修改此宏定义来指定存储到哪个目录
#define TARGET_DIR \
"C:\\Users\\water\\Pictures\\ScreenPicture\\"		

int main(void)
{
	int flag = _chdir(SCREEN_PICTURE_DIR);	                         		//切换工作目录
	if (flag == 0) {								
		printf("工作目录已切换到锁屏壁纸目录\n");
		printf("当前目录为:\n%s\n", _getcwd(NULL, 0));
	}
	else if (flag = -1) {
		printf("工作目录切换失败");
	}

	int cnt = 0;
	struct _finddata_t fileHandler;							//文件遍历句柄
	long searchHandler = _findfirst("*", &fileHandler);				//获取文件搜索句柄
	if (searchHandler != -1) {
		printf("搜索句柄获取成功\n句柄号:%ld\n",searchHandler);
	}
	else {
		printf("搜索句柄获取失败");
	}

	_findnext(searchHandler, &fileHandler);											//前两个为上级目录与本级目录标记,过滤掉
	while (_findnext(searchHandler, &fileHandler) != -1) {							//遍历其中锁屏文件并重命名后移动到目标文件夹

		if (fileHandler.size < 300 * 1024) {										//排除小于300K的文件
			continue;
		}

		cnt++;
		printf("找到第%d个文件\n文件名为:%s\n大小:%ld\n\n", cnt, fileHandler.name,fileHandler.size);
		
		FILE *handlerRead;																//文件打开句柄1
		FILE *handlerWrite;																//文件打开句柄2
		if ((handlerRead = fopen(fileHandler.name, "rb")) == NULL) {					//打开待复制文件
			printf("待复制文件打开失败\n");
			system("pause");
			return 0;
		}

		char dir[500] = TARGET_DIR;
		if((handlerWrite = fopen(strcat(strcat(dir, fileHandler.name), ".jpg")
			,"wb")) == NULL){															//打开复制目标文件
			printf("目标文件打开失败\n");
			system("pause");
			return 0;
		}

		char buffer;
		int byteRead,byteWrite;
		while (byteRead = fread(&buffer, sizeof(char), 1, handlerRead)) {				//写入新文件
			if (byteRead > 0) {															//读取到信息有效
				byteWrite = fwrite(&buffer, sizeof(char), 1, handlerWrite);
			}
			else if (byteRead == 0) {
				break;
			}
		}

		fclose(handlerRead);
		fclose(handlerWrite);

	}

	_findclose(searchHandler);										//结束搜索

	system("pause");
	return 0;
}

改进版代码

此版本会自动遍历用户文件夹列出清单,只需要选择相应用户就行

main.h文件

#ifndef _MAIN_H_
#define _MAIN_H_

#define SCREEN_PICTURE_DIR \
"\\AppData\\Local\\Packages\\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\\LocalState\\Assets\\"

#define USERS_DIR \
"C:\\Users\\"

#define TARGET_DIR \
"C:\\Users\\water\\Pictures\\ScreenPicture\\"

#define FILE_SIZE_FILT_KB 185

typedef struct usrData
{
	char userName[50][300];
	int cnt;
} UserDataTypeDef;				//用户名存储数据结构

int PicConvey(char *sourcePath, char *targetPath, int filteSizeKB);
int UserSearch(char *systemUserDir, UserDataTypeDef *usrData);

#endif // !_MAIN_H_

main.c文件

#include <stdio.h>
#include <stdlib.h>
#include <direct.h>
#include <io.h>
#include <string.h>
#include <malloc.h>
#include "main.h"

int main(int argc, char *argv[])
{
	UserDataTypeDef usrData;
	char screenDir[500] = "";
	int inputNum;
	int cnt;

	UserSearch(USERS_DIR, &usrData);
	printf("请选择你当前的用户文件夹:\n");
	for (cnt = 0; cnt < usrData.cnt; cnt++)
	{
		printf("%d、%s\n", cnt, usrData.userName[cnt]);
	}
	printf(">");
	scanf("%d", &inputNum);
	while (inputNum > usrData.cnt - 1 || inputNum < 0)
	{
		printf("输入非法,请重新输入\n");
		while ((inputNum = getchar()) != EOF && inputNum != '\n');	//不停地使用getchar()获取缓冲中字符,直到获取的c是“\n”或文件结尾符EOF为止
		printf(">");
		scanf("%d", &inputNum);
	}

	strcat(screenDir, USERS_DIR);						//拼接完整路径
	strcat(screenDir, usrData.userName[inputNum]);
	strcat(screenDir, SCREEN_PICTURE_DIR);

	PicConvey(screenDir, TARGET_DIR, FILE_SIZE_FILT_KB);			//文件改名传送

	char cmdString[] = "explorer ";						//打开目标文件夹
	strcat(cmdString, TARGET_DIR);
	system(cmdString);
	return 0;
}

int PicConvey(char *sourcePath, char *targetPath, int filteSizeKB)
//将源路径内大于指定文件大小的文件改名并传送到目标路径
{
	if (_chdir(sourcePath) == -1) {						//切换工作目录
		return -1;							//工作目录切换失败
	}

	int cnt = 0;
	struct _finddata_t fileHandler;						//文件遍历句柄
	long searchHandler = _findfirst("*", &fileHandler);			//获取文件搜索句柄
	if (searchHandler == -1) {
		return -2;							//搜索句柄获取失败
	}

	_findnext(searchHandler, &fileHandler);					//前两个为上级目录与本级目录标记,过滤掉
	while (_findnext(searchHandler, &fileHandler) != -1) {			//遍历其中锁屏文件并重命名后移动到目标文件夹

		if (fileHandler.size < (_fsize_t)(filteSizeKB * 1024)) {	//排除小于185K的文件
			continue;
		}

		cnt++;
		printf("找到第%d个文件\n文件名为:%s\n大小:%ld\n\n", cnt, fileHandler.name, fileHandler.size);

		FILE *handlerRead;						//文件打开句柄1
		FILE *handlerWrite;						//文件打开句柄2
		if ((handlerRead = fopen(fileHandler.name, "rb")) == NULL) {	//打开待复制文件
			printf("待复制文件打开失败\n");
			system("pause");
			return -3;						//待复制文件打开失败
		}

		char dir[500] = "";						//处理目标文件名
		strcat(dir, targetPath);
		strcat(dir, fileHandler.name);
		strcat(dir, ".jpg");

		if ((handlerWrite = fopen(dir, "wb")) == NULL) {		//打开复制目标文件
			printf("目标文件打开失败\n");
			system("pause");
			return -4;						//目标文件打开失败
		}

		char buffer;
		int byteRead, byteWrite;
		while (byteRead = fread(&buffer, sizeof(char), 1, handlerRead)) {	//写入新文件
			if (byteRead > 0) {						//读取到信息有效
				byteWrite = fwrite(&buffer, sizeof(char), 1, handlerWrite);
			}
			else if (byteRead == 0) {
				break;
			}
		}

		fclose(handlerRead);
		fclose(handlerWrite);

	}

	_findclose(searchHandler);							//结束搜索
	return 1;
}

int UserSearch(char * systemUserDir, UserDataTypeDef *usrData)
//搜寻系统中的用户文件夹,并用userData带回
{
	usrData->cnt = 0;

	if (_chdir(systemUserDir) == -1)					//切换目录到系统文件夹目录
		return -1;

	struct _finddata_t fileHandler;						//文件遍历句柄
	long searchHandler = _findfirst("*", &fileHandler);			//获取文件搜索句柄
	if (searchHandler == -1) {
		return -2;												//搜索句柄获取失败
	}
	_findnext(searchHandler, &fileHandler);					//前两个为上级目录与本级目录标记,过滤掉
	while (_findnext(searchHandler, &fileHandler) != -1)
	{
		if ((fileHandler.attrib & _A_SUBDIR) == _A_SUBDIR)		//如果是文件夹就存储入结构体
		{
			usrData->userName[usrData->cnt][0] = '\0';
			strcat(usrData->userName[usrData->cnt], fileHandler.name);
			usrData->cnt++;
		}
	}
	return 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值