需求

windows10的锁屏壁纸不像现在手机的锁屏画报,提供一个保存按钮,导致当我们碰到自己喜欢的锁屏壁纸想保存下来,发现无能为力。因此想做一个这样的功能,能自动下载保存下来windows的锁屏壁纸。

原理

C:\Users\用户名\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets\

代码

//将windows锁频文件自动下载保存到指定的文件夹,默认当前目录
func main() {

	var saveDirStr string ;
	flag.StringVar(&saveDirStr,"dir","./","保存图片的目录")
	flag.Parse()

	if strings.HasSuffix(saveDirStr,"/") || strings.HasSuffix(saveDirStr,"\\"){
		saveDirStr = saveDirStr + "/"
	}

	//系统保存锁频图片的位置
	localAppData := os.Getenv("LOCALAPPDATA")
	systemSaveDir := localAppData + "/Packages/Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy/LocalState/Assets/"
	if _, err := os.Stat(systemSaveDir);err != nil{
		fmt.Println(err)
		return
	}

	if err := CheckDir(saveDirStr);err != nil{
		fmt.Println(err)
		return
	}

	//通过该map来记录图片是否已经存在了
	m := make(map[string]bool)
	saveDir, err := os.Open(saveDirStr)
	if err != nil{
		fmt.Println(err)
		return
	}
	svaeDirFiles, err := saveDir.Readdir(-1)
	if err != nil{
		fmt.Println(err)
		return
	}
	for _,v := range svaeDirFiles{
		if v.IsDir(){
			continue
		}
		m[v.Name()] = true
	}


	systemSaveDirs, _ := os.Open(systemSaveDir)
	files, err := systemSaveDirs.Readdir(-1)
	if err != nil{
		fmt.Println(err)
		return
	}
	//遍历所有的锁频图片
	for _,v := range files{
		if v.IsDir() || m[v.Name()]{
			continue
		}
		//说明该文件还不存在,读取该文件,并写入到一个新的文件中。
		err := CopyFile(systemSaveDir+v.Name(),saveDirStr+v.Name()+".jpg")
		if err != nil{
			fmt.Println(err)
			return
		}
	}
}

//检查目录是否存在或是否是目录
func CheckDir(dir string) error{
	stat, err := os.Stat(dir)
	if err != nil{
		return err
	}
	if !stat.IsDir(){
		return errors.New("请输入文件夹名,而非文件名!")
	}

	return nil
}

//复制文件
func CopyFile(src string,des string)  error{

	source, err := os.OpenFile(src, os.O_RDONLY, 0755)
	if err != nil{
		return err
	}
	destination,err := os.OpenFile(des,os.O_CREATE,0755)
	if err != nil{
		return err
	}
	BUFFERSIZE := 1024
	buf := make([]byte, BUFFERSIZE)
	for {
		n, err := source.Read(buf)
		if err != nil && err != io.EOF {
			return err
		}
		if n == 0 {
			break
		}

		if _, err := destination.Write(buf[:n]); err != nil {
			return err
		}
	}
	return nil
}

用法

go build 编译即可生成.exe文件,代码中使用了golang 中的flag包解析命令行参数。使用方式:-dir=要保存到的目录,即可保存至指定目录,默认当前目录。