fs模块-fs.open和fs.write的使用案例

2021-02-20  本文已影响0人  静昕妈妈芦培培

fs.write(fd, buffer[, offset[, length[, position]]], callback)#

写入 bufferfd 指定的文件。 如果 buffer 是普通的对象,则它必须具有自身的 toString 函数属性。
offset 决定 buffer 中要被写入的部位, length 是整数,指定要写入的字节数。
position 指定文件开头的偏移量(数据要被写入的位置)。 如果 typeof position !== 'number',则数据会被写入当前的位置。

回调有三个参数 (err, bytesWritten, buffer),其中 bytesWritten 指定从 buffer 中被写入的字节数。

不等待回调就对同一个文件多次使用 fs.write() 是不安全的。 对于这种情况,建议使用 fs.createWriteStream()

例1: fs.open设置flags为w,打开文件写入的时候,新写入的内容会覆盖文件原有的所有内容,此时设置fs.write的position无效


image.png
const fs = require('fs')

//设置flags为w,打开文件写入的时候,新写入的内容会覆盖文件原有的所有内容
fs.open('./a.txt', 'w', (err, fd) => {
    if(err) {
        console.err(err)
        return
    }
    fs.write(fd, Buffer.from('今天天气不错'), 6, 6, (error, bytesWritten, buffer) => {
        if(error) {
            console.err(error)
            return
        }
        console.log('写入成功')
    })
})

执行结果:


image.png

解析:


image.png

例2:如果要修改文件内容, fs.open设置flags为'r+',fs.write的参数position代表从文件原内容的第几个字节开始写入,新写入的内容会从那个位置开始替换


image.png
const fs = require('fs')

fs.open('./a.txt', 'r+', (err, fd) => {
    if(err) {
        console.err(err)
        return
    }
    fs.write(fd, Buffer.from('咱们一起出发吧'), 6, 15, 21, (error, bytesWritten, buffer) => {
        if(error) {
            console.err(error)
            return
        }
        console.log('写入成功')
    })
})

执行结果:


image.png

解析:


image.png

例3: 如果要把新写入的内容追加到文件原内容后面, fs.open设置flags为'a',fs.write的参数position无效,因为不管怎样,新内容都会追加到老内容后面


image.png
const fs = require('fs')


fs.open('./a.txt', 'a', (err, fd) => {
    if(err) {
        console.err(err)
        return
    }
    fs.write(fd, Buffer.from('咱们一起出发吧'), 6, 15,  (error, bytesWritten, buffer) => {
        if(error) {
            console.err(error)
            return
        }
        console.log('写入成功')
    })
})

执行结果:


image.png

fs.write(fd, string[, position[, encoding]], callback)#

string 写入到 fd 指定的文件。 如果 string 不是字符串或具有自有 toString 函数属性的对象,则抛出异常。

position 指定文件开头的偏移量(数据要被写入的位置)。 如果 typeof position !== 'number',则数据会被写入当前的位置。 参见 pwrite(2)

encoding 是期望的字符串编码。

回调会接收到参数 (err, written, string),其中 written 指定传入的字符串中被要求写入的字节数。 被写入的字节数不一定与被写入的字符串字符数相同。 参见 Buffer.byteLength

不等待回调就对同一个文件多次使用 fs.write() 是不安全的。 对于这种情况,建议使用 fs.createWriteStream()

例1:如果要把写入的字符串都追加到文件原内容后面,fs.open设置flags为'a',


image.png
const fs = require('fs')

fs.open('./a.txt', 'a', (err, fd) => {
    if(err) {
        console.err(err)
        return
    }
    fs.write(fd, '咱们一起出发吧', 6, (error, written, string) => {
        if(error) {
            console.err(error)
            return
        }
        console.log('写入成功')
    })
})

执行结果:


image.png

例2:如果要用写入的字符串覆盖文件原有的所有内容,fs.open设置flags为'w',


image.png
const fs = require('fs')

fs.open('./a.txt', 'w', (err, fd) => {
    if(err) {
        console.err(err)
        return
    }
    fs.write(fd, '咱们一起出发吧', 6, (error, written, string) => {
        if(error) {
            console.err(error)
            return
        }
        console.log('写入成功')
    })
})

执行结果:


image.png

例3:如果要用写入的字符串修改文件原有的内容,fs.open设置flags为'r+',但是只能从文件原内容开头用新字符依次替换老字符,不能指定开始修改的位置


image.png
const fs = require('fs')

fs.open('./a.txt', 'r+', (err, fd) => {
    if(err) {
        console.err(err)
        return
    }
    fs.write(fd, '咱们一起出发吧', 6, (error, written, string) => {
        if(error) {
            console.err(error)
            return
        }
        console.log('写入成功')
    })
})

执行结果:


image.png
上一篇 下一篇

猜你喜欢

热点阅读