需求
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=要保存到的目录,即可保存至指定目录,默认当前目录。