文件操作

Node.js————文件操作(读取文件信息、读文件、写文件、大文件读写(流式操作))

导入fs文件系统模块:const fs = require('fs')

Node.js中提供了两个与文件操作相关全局可用变量__dirname和__filename

__dirname:表示当前文件所在的目录的绝对路径(不含文件名)
__filename: 表示当前文件的绝对路径(包含文件名)

  1. 读取文件信息:fs.stat(path[, options], callback)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    fs.stat('文件路径', (err, stats) => {
     //一般回调函数的第一个参数是错误对象,若果err为null,表示没有错误,否则表示报错了
     if(err) return;
     if(stats.isFile()){
         console.log('该path是文件')
     }else if(stats.isDirectory()){
         console.log('该path是路径')
     }
    })
    
  2. 读文件操作:fs.readFile(path[, options], callback)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    const fs = require('fs')
    const path = require('path')
    //异步操作  
    let strpath = path.join(__dirname, 'data.txt')//data.txt为读取的文件名  
    //如果有第二个参数并且是编码,那么回调函数获取到的数据就是字符串  
    //如果没有第二个参数,那么得到的就是Buffer实例对象  
    fs.readFile(strpath, 'utf8', (err, data) => {
     if(err) return;
     console.log(data)//输出data.txt文件里面的数据  
    })
    //同步操作  
    let res = fs.readFileSync(strpath, 'utf8')
    console.log(res)//输出data.txt文件里面的数据  
    
  3. 写文件操作:fs.writeFile(file, data[, options], callback)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    const fs = require('fs')
    const path = require('path')
    //异步操作  
    let strpath = path.join(__dirname, 'data.txt')//data.txt为读取的文件名  
    fs.writeFile(strpath, 'hello', 'utf8', (err) => {
     if(!err){
         console.log("文件写入成功")
     }
    })
    //同步操作  
    fs.writeFileSync(strpath, 'hello')
    

大文件的读写操作(流式操作)

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')
let spath = path.join('读取文件路径', '读取文件名')
let dpath = path.join('写入文件路径', '写入文件名')
let readStream = fs.createReadStream(spath);
let writeStream = fs.createWriteStream(dpath);
//基于事件处理方式
let num = 1;//用于记录读取文件时执行多少次函数
readStream.on('data', (chuck) => {
    num++;
    writeStream.write(chuck);
})
readStream.on('end', () => {
    console.log('文件处理完成')
})
//-----------------------------------------------
//简洁方法
//pipe的作用直接把输入流和输出流链接在一起
readStream.pipe(writeStream);
//-----------------------------------------------
//或者更简便,把上面声明的readStream和writeStream变量的两步省略
fs.createReadStream(spath).pipe(fs.createWriteStream(dpath));

目录操作

  1. 创建目录
    异步:fs.mkdir(path[, options], callback)
    同步:fs.mkdirSync(path[, options])
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    const path = require('path')
    const fs = require('fs)
    //异步创建目录
    fs.mkdir(path.join(__dirname, '文件名'), (err) => {
     console.log(err)
    })
    //---------------------------------------------------
    //同步创建目录
    fs.mkdirSync(path.join(__dirname, '文件名'))
    
  2. 读取目录 异步:fs.readdir(path[, options], callback)
    同步:fs.readdirSync(path[, options])
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    //异步读取目录
    fs.readdir(__dirname, (err, files) => {
     files.forEach((item, index) => {
         fs.stat(path.join(__dirname, item), (err, stat) => {
             if(stat.isFile()){
                 console.log(item, '文件')
             }else if(stat.isDirectory()){
                 console.log(item, '目录')
             }
         })
     })
    })
    //--------------------------------------------------
    //同步读取目录
    let files = fs.readdirSync(__dirname);
     files.forEach((item, index) => {
         fs.stat(path.join(__dirname, item), (err, stat) => {
             if(stat.isFile()){
                 console.log(item, '文件')
             }else if(stat.isDirectory()){
                 console.log(item, '目录')
             }
         })
     })
    
  3. 删除目录
    异步:fs.rmdir(path[, options], callback)
    同步:fs.rmdirSync(path[, options])
    1
    2
    3
    4
    5
    6
    7
    
    //异步删除目录
    fs.rmdir(path.join(__dirname, '删除的文件名'), (err) => {
     console.log(err)
    })
    //--------------------------------------------------
    //同步删除目录
    fs.rmdirSync(path.join(__dirname, '删除的文件名'))
    


-->