Skip to content

01 fs 了解

index.js
js
/**
 * API 大多有三种操作方式
 * 方式1:同步操作文件:代码会被阻塞
 * 方式2:异步回调操作文件:需要传入回调函数 调用回调 获取结果
 * 方式3:异步Promise :返回Promise 通过 then catch 来处理
*/
const fs = require('fs')
const filePath = "./abc.txt"
// 方式1 同步通过操作
const getFileStatus1 = fs.statSync(filePath)
console.log('获取文件', getFileStatus1)//获取文件 
/**
 * Stats {
  dev: 4031650434,
  mode: 33206,
  nlink: 1,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: 4096,
  ino: 281474978062517,
  size: 17,
  blocks: 0,
  atimeMs: 1694870024431.592,
  mtimeMs: 1694870024431.592,
  ctimeMs: 1694870024431.592,
  birthtimeMs: 1694870007769.3984,
  atime: 2023-09-16T13:13:44.432Z,
  mtime: 2023-09-16T13:13:44.432Z,
  ctime: 2023-09-16T13:13:44.432Z,
  birthtime: 2023-09-16T13:13:27.769Z
}
*/

// 方式2 异步获取
// const getFileStatus2 = 
fs.stat(filePath, (err, data) => {
    console.log('err', err)
    console.log('data', data)// 同上
})
// console.log('getFileStatus2', getFileStatus2);

// 方式3 异步Promise
fs.promises.stat(filePath).then(res => {
    console.log('res', res);// 同上
}).catch(err => console.log(err))

02 fs 文件的读写

文件的读写.js
js
/**
 * 
 * 
*/
const fs = require('fs')
const filePath = "./abc.txt"
const content = "hello world 我是 hello World"
/**
 * 1文件写入
 * @param{filePath, content,options:{flag:""},callback} 
 * 
*/
fs.writeFile(filePath, content, (err) => {
    console.log(err);//null error
})
// 注意读取写入 不要同时使用
// 2读取文件
fs.readFile(filePath, { encoding: 'utf-8' }, (err, data) => {
    console.log('data', data)//data hello world 我是 hello World
})

03 fs 文件夹操作

文件夹操作.js
js
/**
 * 文件夹的操作
 * 1.创建文件夹
 * 2.读取文件所在文件的所有文件
 * 3.文件夹的重命名
*/
const fs = require('fs')
const path = require('path')

const filePath = "./测试文件夹"
// 判断文件是否存在
console.log('fs.Directory.exists(filePath)', fs.existsSync(filePath))
if (!fs.existsSync(filePath)) {
    // 1.创建文件夹
    fs.mkdir(filePath, (err) => {
        console.log('err', err)
    })
}

// 2.读取文件所有文件
// 封装获取文件在所有内容文件
const getFiles = (filePath, result) => {
    return new Promise((resolve, reject) => {
        fs.promises.readdir(filePath, { withFileTypes: true }).then(files => {
            files.forEach(file => {
                result.push(file.name)
                if (file.isDirectory()) {
                    getFiles(path.resolve(filePath, file.name), result)
                }
            })
            files.filter(file => file.isDirectory()).length === 0 && console.log(result) && resolve(result)
        })

    })
}
// 深层的await return 
getFiles(filePath, []).then(res => {
    console.log('res', res);
})

// fs.readdir(filePath, { withFileTypes: true }, (err, files) => {
//     files.forEach(file => {
//         console.log('是否是个文件夹', file.isDirectory());
//         console.log('是否是文件', file.isFile())
//         console.log('文件名', file.name);
//     })
// })
// 3.文件夹的重命名
if (!fs.existsSync('./测试文件夹/testReName')) {
    fs.rename("./测试文件夹/test", "./测试文件夹/testReName", (err) => {
        console.log('err', err)
    })
}
// 4.文件的复制
fs.copyFile('./测试文件夹/testReName/tr01.txt', './测试文件夹/testReName/tr02.txt', (err) => {
    console.log('err', err);
})

04 fs 文件描述符

文件描述符.js
js
/**
 *文件描述符
 并通过文件描述符来获取文件信息
*/
const fs = require('fs')
const filePath = "./abc.txt"

fs.open(filePath, (err, fd) => {
    if (err) {
        console.log(err)
    } else {
        console.log('fd', fd)
        // 通过文件描述符来获取文件信息
        // 在这用 总觉得是在脱裤子放屁
        fs.fstat(fd, (err, stat) => {
            console.log('stat', stat)
            console.log('err', err)
        })
    }
})