每次,当我打开电脑。看到win10那美美的锁屏壁纸都舍不得进入,在那静静欣赏。
每天,它都以不同的姿态展示(首先得设置锁屏壁纸为win10聚焦,如下图)。某天觉得当天的锁屏壁纸特别好看想把它保存下来,于是便开始找win10聚焦的壁纸在电脑的哪个地方。
费了九牛二虎之力(假的),果然功夫不负有心人,win10的壁纸默认保存在如下的目录中:
C:\Users\bing\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets
目录下的文件是这样的:(黑人???)
聪明的我又想到了:要不手动加个后缀名。正如聪明的我想的这样是行得通的。通过一连串帅气的操作:
- ctrl+a全选,ctrl+c复制,
- 到桌面 新建文件夹
- 进入刚刚新建的文件夹 ctrl+v。 然后一个个改名?no no no.作为一个爱偷懒的人我是不会这个做的。
首先 想到 cmd的ren命令 1.在刚刚新建的文件夹下新建一个文本文件 2.用记事本打开 键入
ren * *.png
3.重命名该文本文件为 xxx.bat 4.点击.bat文件,然后该文件夹下所有的文件都变成以.png结尾的文件
不久之后 我写了几句java,带界面的选择文件夹后自己手动键入后缀名来批量修改,不过还是得手动拷贝出来之后。运行效果如下:
可以说是异常的简单。
好了,毕竟上面的都是过去的事了,前面废话那么多了是该进入正题了。 最近我在想我要自动拷贝win10聚焦的图片到某个文件夹下。
首先 分析得出已知条件如下:
- 源文件夹,即聚焦壁纸所在文件夹
- 源文件的 二进制(十六进制视图)以FFD8FF开头的就是jpg文件,文件头是89504E47就是png文件。
现在的问题: 1.想要在不同的电脑上运行,源文件是在用户下的即如下:
C:\Users\用户\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets
我当前的用户是bing所以源文件的目录是
C:\Users\bing\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets
聪明的我立即就想到node的进程对象process对象上是否能获得当前用户,于是立即打开powerShell验证,果不其然
process.env.localappdata就可以了。 于是开始写代码了。 敲啊敲,,,,,敲啊敲,,,,,敲啊敲,,,,, 其中会用到ES7的async/await方法。 加上为了练习Promise而改造的一个异步函数也就100行代码。
const fs = require('mz/fs');
const path = require('path');
const imageInfo = require('image-info');
/*壁纸所在的源文件夹*/
const src = path.join(process.env.localappdata, "\\Packages\\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\\LocalState\\Assets\\");
/*要拷贝到的文件夹:这个是在‘图片/spotlight’*/
const target = path.join(process.env.userprofile, 'Pictures\\spotlight');
start();
async function start() {
await checkdir();
await copyFile();
}
/*判断spotlight文件夹是否存在*/
async function checkdir() {
try {
const s = await fs.stat(target);
if (!s.isDirectory()) {
await fs.mkdir(target);
}
} catch (error) {
await fs.mkdir(target);
}
}
/*读取源文件目录下的所有文件*/
async function copyFile() {
const files = await fs.readdir(src);
files.forEach(async (file) => {
const stats = await fs.stat(path.join(src, file));
if (stats.isFile()) {
const data = await fs.readFile(path.join(src, file));
const tempData = data.slice(0, 7);
let filename;
if (tempData.indexOf(Buffer.from('FFD8FF', "hex")) != -1) {
filename = path.join(target, file + ".jpg");
} else if (tempData.indexOf(Buffer.from('89504E47', 'hex')) != -1) {
filename = path.join(target, file + ".png");
}
if (filename) {
const info = await imgInfo(path.join(src, file));
var wh = info.height / info.width;
if (wh != 1&&info.bytes>102400) {
await fs.writeFile(filename, data);
}
}
}
});
}
function imgInfo(filename) {
return new Promise(function (resolve, reject) {
imageInfo(filename, (err, info) => {
if (err) {
reject(err);
}
resolve(info);
})
})
}
真的不到100行啊......
运行后:
可以在这里clone我的代码到自己的电脑上运行————>这里这里前提是win10,node环境。
clone后: 1.
npm install
node index
← 监听dom变化 js 异步事件的并发和继发 →