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

xiaoxiao2021-03-01  29

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; }
转载请注明原文地址: https://www.6miu.com/read-4199919.html

最新回复(0)