const fs = require('fs')

Nodejs 文件系统 ( fs模块 ) 的方法均有异步和同步,例如:读取文件内容 fs.readFile( ) 和 同步的fs.readFileSync( )。异步方法最后一个参数为回调函数,回调函数第一个参数包含错误信息(error)。最好使用异步方法,比起同步方法,异步方法性能更高,且没有阻塞。

 

fs.writeFile 、fs.writeFileSync 

- 写入文件,以同步写入为例: 

fs.wirteFileSync(path, content, [options] )

path : 绝对路径 或 相对路径都行

content : 写入的内容,可以是一个字符串 或者 buffer对象

options: 可选项,参数如下:

· flag

        *  默认为 'w'  -> 文件不存在时,创建该文件,文件已经存在时重写该文件;

        *  'w+'  -> 打开文件进行读写,如果不存在则创建文件;

        *  'r+'  -> 打开文件进行读写,如果不存在则抛出异常;

        *  'r'  -> 打开文件读取,读取时默认值;

        *  'a'  -> 打开要写入的文件,将流放在文件末尾,如果不存在则创建文件;

        *  'a+'  -> 打开文件以进行读写,将流放在文件末尾。如果不存在则创建文件;

· mode 默认为当文件被打开时,该文件的读写权限,默认值为 066 (可读写);

· encoding

指定使用何种编码格式来写入文件,当data参数为一个buffer对象时,该属性可忽略,默认使用utf8来执行文件的写入。

关于更详细的字符编码,推荐一篇文章:​详解字符编码​

// 同步在该文件目录 - 创建一个user.txt的文件
fs.wrieFileSync(path.join(__dirname, ' /user.txt'), '大家好,我叫&%&……%,我来自火星!')
// 异步
fs.writeFile(path.join(__dirname, '/user.txt'), '', (err) => {})

node - fs模块_文件描述符

 

 

 

fs.appendFile、fs.appendFileSync - 将数据追加到文件

fs.appendFileSync(path, content)

path : 要追加的文件的 绝对路径 或 相对路径都行

content : 追加写入的内容

注意:

与 writeFileSync 的区别如果该文件存在,会在源文件内容的后边追加内容,如果不存在,会创建一个文件,把内容写入进去。

fs.appendFile(
path.join(__dirname, '/users.txt'),
'我叫哈利,来自遥远的火星世界。',
(err) => {
console.log('err: ', err)
}
)

node - fs模块_相对路径_02

 

fs.readFile 、fs.readFileSync - 读写文件

同步读取:

let bufferData = fs.readFileSync(path, [options])

异步读取:

let bufferData = fs.readFile(path, [options], (err, data) => {

      console.log(data) // 返回结果

})

path : 文件的绝对路径 或 相对路径都行

options: 可选的配置项对象,如下:

· flag 属性指定对文件采取什么操作:

(1)默认值为 flag = 'r' ,如果指定文件不存在,则抛出异常。

· encoding  属性指定编码格式( 'utf8', 'base64', 'ascii' )。

· callback  读取完毕执行的回调操作。

注意:成功读取的数据是一个二进制内容的buffer缓存区对象

小例子:

// 复制logo.png 
fs.readFile('./logo.png', encoding='base64', (err, data) => {
if(err) {
console.log('读取失败:', err)
return
}
fs.writeFile('./fuzhi_logo.png', data.toString(), encoding='base64', (erro) => {
if(erro) {
console.log('复制失败:', err)
return
}
})
})

node - fs模块_绝对路径_03

 

fs.exists(path, callback)

检查一个文件或目录是否存在,存在返回true,不存在返回false。

fs.exists('./1.png', (status) => {
console.log('status', status)
})

 

fs.readdir(path, [options], callback) 、fs.readdirSync(path)

path: 绝对路径或绝对路径

options: 一个可选配置,{withFileTypes:true} 时,callback中的参数files会不太一样:

node - fs模块_绝对路径_04

当我们使用遍历此数组时,

flles.forEach(file => {

    file.name // 可获取到文件名或文件夹名

    file.isDirectory() // 可判断是否为一个文件夹

})

callback: (err, files)=> {} 回调函数,成功的话读取的files是一个文件列表。

异步/ 同步 读取指定目录下,返回的结果是所有文件的列表:

// 一个简单的路由注册的小例子:
/** routers文件目录
routers
|
index.js
|
user1.js
|
user2.js
**/
// 读取routers目录下所有的文件,index.js文件除外,然后注册路由
// index.js
const fs = require('fs')
console.log('文件列表为:', fs.readdirSync(__dirname))
// 文件列表为:[ 'index.js', 'user1.js', 'user2.js' ]
const initRouter = (app) => {
fs.readdirSync(__dirname).forEach(ele => {
if(ele !== 'index.js') {
app.use(require(`./${ele}`).routes())
}
})
}
module.exports = {
initRouter
}

//======================================================
//user1.js
const Router = require('koa-router')
const user1 = new Router()
user1.get('/user1', (ctx, next) => {
ctx.body = 'success'
next()
})
module.exports = user1

//======================================================
//user2.js
const Router = require('koa-router')
const user2 = new Router()
user2.get('/user2', () => {})
module.exports = user2

输出一个文件夹下的所有文件,这个题需要使用递归来判断,因为可能一个文件夹下存在别的文件夹:

node - fs模块_文件描述符_05

const p = './a';
function getFiles(dirname) {
fs.readdir(dirname, {withFileTypes: true}, (err, files) => {
files.forEach(file => {
if(file.isDirectory()) {
let filePath = path.resolve(dirname, file.name)
getFiles(filePath)
}else {
console.log(file.name)
}
})
})
}
getFiles(p)

 

fs.mkdir

创建文件夹,如果存在,会报错!

// 先来判断下是否有此文件夹
const p = './d'
if(!fs.existsSync(p)) {
fs.mkdir(p, (err) => {
if(err) {
console.log(err)
return
}
console.log('创建成功')
})
}

 

fs.statSync()

获取文件信息

const p = './1.txt'
fs.stat(p, (err, info) => {
console.log(info)
})

node - fs模块_绝对路径_06

补充:在上边打印的info文件信息中,info其实有两个非常重要的方法,判断这个文件是一个文件还是一个文件夹:

const p = './1.txt';
fs.stat(p, (err, info) => {
info.isFile() // 判断是否是一个文件,返回true或false
info.isDirectory() // 判断是否是文件夹,返回true或false
})

 

文件描述符

定义:

在 POSIX 系统上,对于每个进程,内核都维护着一张当前打开着的文件和资源的表格。 每个打开的文件都分配了一个称为文件描述符的简单的数字标识符。 在系统层,所有文件系统操作都使用这些文件描述符来标识和跟踪每个特定的文件。 Windows 系统使用了一个虽然不同但概念上类似的机制来跟踪资源。 为了简化用户的工作,Node.js 抽象出操作系统之间的特定差异,并为所有打开的文件分配一个数字型的文件描述符。

fs.open()

方法用于分配新的文件描述符(fd),一旦被分配,则文件描述符可用于从文件读取数据、向文件写入数据、或请求关于文件信息等。

const p = './1.txt'
// fd就是文件描述符,它是一个数字
fs.open(p, (err, fd) => {
fs.fstat(fd, (err, stat) => { // 读取文件信息
console.log(stat)
})
})

打印结果同上。

  

 

未完成,待续!