一键保存

简单描述一下就是,在桌面生成一个bash命令的快捷方式,当拖动文件在这个快捷方式上打开时,就会自动将这个文件保存到你本地的MongoDB中。

我搞来就是想写东西的时候,保存顺便备份。。。


首先安装好MongoDB

不懂直接菜鸟教程:Windows 平台安装 MongoDB

然后装好npm

这个使用node.js跑的

接着搞个文件夹

创建两个文件,分别是: save.js 和 savefile.bat

然后上代码:

没有 mongodbnode-cmd 这两个库的先npm装一下嘛,不能懒哦~
(虽然我搞这玩意就是因为懒……)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// save.js

const { MongoClient } = require('mongodb');
const fs = require("fs");
const cmd = require("node-cmd")
// or as an es module:
// import { MongoClient } from 'mongodb'

// Connection URL
const url = 'mongodb://localhost:27017';
const client = new MongoClient(url);

// Database Name
const dbName = 'file';

async function main(path) {

// Use connect method to connect to the server
await client.connect();
console.log('Connected successfully to server');
const db = client.db(dbName);
const collection = db.collection('file');

path = path.replace(/\\/g, '/')
console.log(path)

// 分割路径 + 文件名
function getDirName(path) {
var arr = path.split("/")
var filename = arr[arr.length -1]
var fileDir = "";
for (let i = 0; i < arr.length-1; i++) {
fileDir += arr[i] + "/"
}
return [fileDir,filename]
}
[fileDir,filename] = getDirName(path);

// 获取文件大小
function getSize(path) {
var size;
var fileMsg = fs.statSync(path);
if(fileMsg.size < 1024) size = fileMsg.size + 'b'
else if(fileMsg.size < 1024 * 1024) size = (fileMsg.size/1024).toFixed(2) + 'kb'
else if(fileMsg.size < 1024 * 1024 * 1024) size = (fileMsg.size/1024/1024).toFixed(2) + 'MB'
return size;
}
var size = getSize(path)

// 获取文件数据
var data = fs.readFileSync(path)

// 获取当前时间
var time = new Date().toLocaleString()

// 插入数据
var insertResult = await collection.insert(
{
path,
fileDir,
filename,
data,
size,
time
}
)
console.log(insertResult)
fs.appendFileSync("log", time + "\t:\t" + path + "\t" + "insertedCount:" + insertResult.insertedCount + "\n")

return 'done.';
}

function sleep(ms){
return new Promise(resolve=>setTimeout(resolve, ms))
}
async function pause(ms) {
await sleep(ms)
}

var args = process.argv.splice(2)
var path = args[0]
console.log(path)

main(path)
.then(console.log)
.catch(console.error)
.finally(() => {
client.close()

console.log("MongoDB Server (MongoDB) 服务正在停止 .")
cmd.run("net stop mongodb")
console.log("MongoDB Server (MongoDB) 服务已成功停止。")
});

console.log("\nfinish\n")

pause(2000)
1
2
3
4
5
6
7
8
9
# savefile.bat

@echo off

echo %1 # 打印这个文件的路径
net start mongodb # 启动MongoDB服务
npm start %1 # 启动上面的save.js

pause

然后改一下这个package.json ,加个 scripts 上去,和bat中的start一起就能跑起来了。

1
2
3
4
5
6
7
8
9
10
11
12
# package.json

{
"dependencies": {
"mongodb": "^4.3.0",
"node-cmd": "^5.0.0"
},
"main": "save.js",
"scripts": {
"start": "node save.js"
}
}

然后,然后就没有然后了…

那倒也不是,然后就是把 savefile.bat 创建桌面快捷方式,然后就可以把你的word文档呀,markdown呀,乱七八糟的东西,拖到桌面的快捷方式上去 松手,备份完毕,

至于怎么看嘛。。。

搞个cmd

1
2
3
4
$ mongo
$ use file
$ db.file.find({},{data:0}) # 不看data,因为都是二进制数据
$ db.file.find({},{data:0}).pretty() # 格式化输出

记录了文件名,大小,保存时间,还有保存时文件所在的路径。

而且还可以重复保存,也不会覆盖掉,时间不同嘛 就可以区分版本,所以我就搞来当备份用了


最后

还是再唠嗑一下吧,

用这个保存过之后,会在这个文件夹下生成一个log,你就能看到自己曾今保存了什么了。

还有就是,现在这玩意是二进制存储的,还可以搞一下压缩,读完文件之后 压缩完再丢进去,虽然说是MongoDB 存个几G几T都还行,但毕竟存在本地嘛…

但别人删你文件的时候,清空回收站,但其实还可以恢复,就很nice!

写论文,写文档的时候就很棒,还可以存点***那些东西咳咳… 隐藏文件夹什么的有什么用嘛,光明正大的白给

有时间再弄个恢复文档的客户端 (什么叫在线点播呀,后仰.jpg)


再说个坑吧

就是,.bat 中 %1 代表传进去的第一个参数嘛,这个挺好理解的

然后就是跑了 npm start %1 这个时候,后面的都不生效了,跑完就直接闪退了…就很懵

本来我是想这样的:

1
2
3
4
5
net start mongodb	# 启动服务
npm start %1 # 跑、存文件
net stop mongodb # 停止服务
pause # 任意键退出

但结果就是后面两步不执行,直接闪退…

如果是用start 启动node的话,他就相当于再新建了一个cmd来跑,跑完了就不能退了,就会留了个黑框得自己关,而且这可以算是一个异步过程,要是没存完就把服务关了,就很。。。

总之就不是我所想的那样。。。

所以我就把后面两步写在node里面了,用里面的 node-cmd 来跑算了