WIN10的锁屏会定期自己更新锁屏壁纸,有些壁纸还是蛮好看的,可惜win10的锁屏壁纸缓存目录藏得挺深的,而且文件名都是没有后缀名的乱码(其实就是jpg文件,只不过缓存时没有加上后缀名),有时看到喜欢的锁屏壁纸想用来当桌面壁纸,还要点无数下鼠标到缓存文件夹,然后给文件一个个加上jpg后缀名来查找对应的壁纸文件。
为了一劳永逸的解决壁纸问题,顺带练练手,于是我写了下面这个程序,此程序会自动搜寻锁屏壁纸缓存目录内的缓存文件,并将壁纸文件添加jpg后缀名后复制到 我的文档的图像文件夹内。,此代码在VS2017下编译正常。
#include
#include
#include
#include
#include
//修改此宏定义来指定锁屏壁纸缓存文件的所在路径(一般只需要将 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
#include
#include
#include
#include
#include
#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;
}