0%

使用 Flutter 解决一个小需求

collection_file

参考

资源

collection_file

大概五天前, 遇到个小问题, 想把从 B 站上缓存的视频提取到同一目录级别下
先是去酷安找了下, 果然如我所料, 像这种冷门的小需求没有现成的软件可以用啊
后来我是直接把手机连上电脑, 用 node 写了个小脚本来做这件事情
代码如下:

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
const fs = require('fs')
const path = require('path')
const fse = require('fs-extra')
const crypto = require('crypto')

const getMD5 = file =>
crypto
.createHash('md5')
.update(fs.readFileSync(file))
.digest('hex')


async function extract (input, output, operating, suffix) {
const fileAndDir = fs.readdirSync(input)
for (const item of fileAndDir) {
const fullPath = path.join(input, item)
const stat = fs.statSync(fullPath)
if (stat.isDirectory()) {
// 是目录则递归
await extract(path.join(input, item), output, operating, suffix)
} else if (path.extname(item) === suffix) {
// 后缀匹配则执行操作
if (operating === 'move') {
fse.move(fullPath, path.join(output, `${getMD5(fullPath)}${suffix}`))
} else /* is copy*/{
fse.copy(fullPath, path.join(output, `${getMD5(fullPath)}${suffix}`))
}
}
}
}
const run = async (input, output, operating, suffix) => {
// ensure
await fse.ensureDir(input)
await fse.ensureDirSync(output)
// extract
extract(input, output, operating, suffix)
}
run('O:/download', 'O:/output', 'move', '.blv')

但是因为 node 无法直接访问到手机的内存卡
需要先把文件 copy 到 windows 磁盘中操作, 又慢又麻烦
又没找到如何才能给手机内存分配盘符的方法, 只好另辟途径了
然后就想到用 termux 在手机上执行 nodejs.
后来一想,搞这许多, 不如干脆点写个小 app 算了.
一开始是准备用 react-native 写, 但是遇到几个问题, 受不了, 所以就转用 flutter 了.
除了 dart 的分号看着有点别扭外, 开发体验挺舒服的, 尤其是静态语言的 API 提示是真的爽。
节选代码如下:

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
void _setMessage(String msg) {
setState(() {
_counter = msg;
});
}

void _collectionFile(Directory inputDir, Directory outputDir,
String operating, String suffix) {
_setMessage('Start scanning...');
String suf = '.$suffix';
inputDir
.list(recursive: true, followLinks: false)
.listen((FileSystemEntity entity) async {
if (entity is File) {
String ext = p.extension(entity.path);
if (ext == suf) {
String fileMD5 = await _calculateMD5SumAsyncWithPlugin(entity.path);
String outputFilePath =
'${outputDir.path}/${sha1.convert(utf8.encode(fileMD5))}$suf';
if (File(outputFilePath).existsSync()) {
_setMessage('${p.basename(outputFilePath)} is exists');
} else {
if (operating == 'copy') {
entity.copy(outputFilePath).whenComplete(() {
_setMessage('Copy ${p.basename(outputFilePath)} Complete');
});
} else /* move */ {}
}
// print(entity.path);
}
}
});
}

void _startCollectionFile(
String input, String output, String operating, String suffix) async {
if (input != null &&
output != null &&
operating != null &&
suffix != null &&
_hasValidMime &&
_counter != 'Start scanning...') {
Directory inputDir = await Directory(input).create(recursive: true);
Directory outputDir = await Directory(output).create(recursive: true);
_collectionFile(inputDir, outputDir, operating, suffix);
}
}

解决一个小需求就花了我五天, 如果没有这些大佬们开源出来的框架和库, 我又需要多少个五天呢?