nodejs文件操作
# nodejs文件操作
# 读文件
- 简单文件读取
/**
* 成功:
* data 数据
* error null
* 失败
* data undefined
* error 错误对象
*/
var fs = require('fs');
fs.readFile('./test file/读取文件.txt', function (error, data) {
if (error) {
console.log('读取文件失败');
console.log(error);
} else {
// 默认输出是二进制
console.log(data);
// 需要用toString方法转换
console.log(data.toString());
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- 流读取
/**
* 流读取
*/
const rs = fs.createReadStream('test file/流写入测试.txt');
// 监听读到的数据
rs.on('data', function(data){
console.log(data);
});
rs.once('open', function(){
console.log('readStream开启了');
});
rs.once('close', function(){
console.log('readStream结束了');
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 写文件
- 简单文件写入
var fs = require('fs');
// 第一个参数:文件路径
// 第二个参数:文件内容
// 第三个参数:回调函数(error,没有错误返回null)
fs.writeFile('./test file/写入文件.txt', '大家好,我是小明\n我今天很开心', function (error) {
if(error){
console.log('写入失败');
}else{
console.log('写入成功');
}
});
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 流写入
// flags:r-只读, w-只写,没有文件的时候创建, a-追加内容,没有文件的时候创建
const ws = fs.createWriteStream('./test file/流写入测试.txt', { flags: 'a', encoding: 'utf-8' });
ws.write('这是流写入的文件\n');
ws.write('哈哈\n');
ws.end();
ws.once('open', function () {
console.log('写入流开启了');
})
ws.once('close', function () {
console.log('写入流关闭了');
})
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 复制文件
- 方法一:
// 创建流
const rs = fs.createReadStream('./test file/读取文件.txt');
const ws = fs.createWriteStream('./test file/copy/方法1.txt', 'utf-8');
// 读取
rs.on('data', function (data) {
// 写入
ws.write(data, function (error) {
if (error) {
console.log(error);
} else {
console.log('写入成功');
}
});
})
rs.once('open', function () {
console.log('读取流开启');
})
rs.once('close', function () {
console.log('读取流关闭');
// 关闭写入流
ws.end();
})
ws.once('open', function () {
console.log('写入流开启');
})
ws.once('close', function () {
console.log('写入流关闭');
})
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
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
- 方法二:
// 创建流
const rs = fs.createReadStream('./test file/读取文件.txt');
const ws = fs.createWriteStream('./test file/copy/方法1.txt', 'utf-8');
// 通过管道 ====> 读取流.pipe(写入流)
rs.pipe(ws);
1
2
3
4
5
2
3
4
5
# 剪切/重命名文件
// 第一个参数:旧路径,第二个参数:新路径
fs.rename('./test file/流写入测试123.txt', 'D:/CS6/流写入测试.txt', function (error) {
if (!error) {
console.log('剪切成功');
} else {
console.log(error);
}
});
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 文件状态
const fs = require('fs');
fs.stat('./test file/读取文件.txt', function(err, stat){
// 一般回调函数的第一个参数是错误对象,为null时表示没有错误
if(err){
console.log(err);
return;
}
// 判断是文件还是目录的方法
if(stat.isFile()){
console.log('这是文件');
}else if(stat.isDirectory()){
console.log('这是目录');
}
// stat属性
/**
* atime: 访问时间
* ctime: 文件的状态信息发生变化的时间(比如权限)
* mtime: 文件数据发生变化的时间
* brithtime: 文件创建时间
*/
console.log(stat);
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 目录操作
# 创建目录
const fs = require('fs');
const path = require('path');
// 创建目录,如果目录已存在,会创建失败
fs.mkdir(path.join(__dirname, '新建目录'), function (err) {
if (err) {
console.log(err);
}
});
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 读取目录
const fs = require('fs');
const path = require('path');
// 读取目录
fs.readdir(__dirname, function (err, files) {
if (!err) {
// files是数组,判断是文件还是目录
files.forEach(item => {
const stat = fs.statSync(path.join(__dirname, item));
if (stat.isFile) {
console.log(`${item} ===> 是文件`);
} else if (stat.isDirectory) {
console.log(`${item} ===> 是目录`);
} else {
console.log(`${item} ===> 未知`);
}
})
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 删除目录
// 删除目录,只能删除空目录
fs.rmdir(path.join(__dirname, '新建目录'), function(err){
if(err) console.log(err);
});
1
2
3
4
5
2
3
4
5
# 案例
# 文件操作
/**
* 文件操作案例
*/
const path = require('path');
const fs = require('fs');
// 初始化数据
let initData = {
root: 'C:/Users/19758/Desktop',
projectName: 'mydemo',
data: [{
name: 'img',
type: 'dir'
}, {
name: 'css',
type: 'dir'
}, {
name: 'js',
type: 'dir'
}, {
name: 'index.html',
type: 'file'
}]
}
// 创建项目根路径
fs.mkdir(path.join(initData.root, initData.projectName), function (err) {
if (err) {
console.log('创建根目录失败');
return;
}
initData.data.forEach(item => {
const tempPath = path.join(initData.root, initData.projectName, item.name);
if (item.type === 'dir') {
// 创建子目录
fs.mkdir(tempPath, function (err) {
if (err) {
console.log(`创建子目录${item}失败`);
}
});
} else if (item.type === 'file') {
// 创建文件,并写入内容
const fileContent = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>${item.name}的文件内容</h1>
</body>
</html>`;
fs.writeFile(tempPath, fileContent, function(err){
if(err){
console.log(`文件${item.name}写入失败`);
}
});
}
})
});
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
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
# markdown
const fs = require('fs');
const path = require('path');
const md = require('markdown-it')();
const tplPath = path.join(__dirname, 'test file/markdown测试/markdown测试模板.html');
const mdPath = path.join(__dirname, 'test file/markdown测试/markdown测试.md');
const targetPath = path.join(__dirname, 'test file/markdown测试/生成的markdown页面.html');
// 读取markdown内容
fs.readFile(mdPath, 'utf-8', function (err, mdData) {
if (err) {
console.log('获取markdown内容失败');
} else {
// 对内容进行输出
const mdContent = md.render(mdData);
// 读取模板内容
const tpl = fs.readFile(tplPath, 'utf-8', function (err, tplData) {
if (err) {
console.log('获取模板内容失败');
} else {
// 替换模板内容
const tplContent = tplData.replace('{{content}}', mdContent);
// 生成最终页面写入目标文件
fs.writeFile(targetPath, tplContent, function (err) {
if (err) {
console.log('生成失败' + err);
} else {
console.log('生成内容成功');
}
});
}
});
}
})
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
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
上次更新: 2020/12/06, 21:12:00