Liang2uv's blog Liang2uv's blog
首页
  • 前端文章

    • JavaScript
    • Vue
    • 面试总结
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 小程序笔记
    • TypeScript笔记
    • 数据结构笔记
    • mongoDB笔记
    • nginx笔记
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • 关于
  • 作品集

Liang2uv

我也想成为前端大佬
首页
  • 前端文章

    • JavaScript
    • Vue
    • 面试总结
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 小程序笔记
    • TypeScript笔记
    • 数据结构笔记
    • mongoDB笔记
    • nginx笔记
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • 关于
  • 作品集
  • 技术文档

  • GitHub技巧

  • Nodejs

    • nodejs递归读取所有文件
    • nodejs文件操作
      • 读文件
      • 写文件
        • 复制文件
        • 剪切/重命名文件
      • 文件状态
      • 目录操作
        • 创建目录
        • 读取目录
        • 删除目录
      • 案例
        • 文件操作
        • markdown
    • nodejs服务器相关
  • 博客搭建

  • 技术
  • Nodejs
Liang2uv
2019-10-06

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
  • 流读取
/**
 * 流读取
 */
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

# 写文件

  • 简单文件写入
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
  • 流写入
// 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

# 复制文件

  • 方法一:
// 创建流
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
  • 方法二:
// 创建流
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

# 剪切/重命名文件

// 第一个参数:旧路径,第二个参数:新路径
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

# 文件状态

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

# 目录操作

# 创建目录

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

# 读取目录

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

# 删除目录

// 删除目录,只能删除空目录
fs.rmdir(path.join(__dirname, '新建目录'), function(err){
    if(err) console.log(err);
});

1
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

# 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
上次更新: 2020/12/06, 21:12:00
nodejs递归读取所有文件
nodejs服务器相关

← nodejs递归读取所有文件 nodejs服务器相关→

最近更新
01
第十章:排序
11-05
02
第九章:查找
11-05
03
第八章:图
11-05
更多文章>
Theme by Vdoing | Copyright © 2020-2021 Liang2uv | 桂ICP备19012079号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式