【问题标题】:Can I don't create a file with writeFileStream?我可以不使用 writeFileStream 创建文件吗?
【发布时间】:2019-12-16 17:18:04
【问题描述】:

我创建了一个 writeFileStream 并使用 readableStream 对其进行管道传输。

在数据上,我检查数据的长度,如果长度太短,不要使用 writeFileStream 创建文件。

我可以中止使用 writeFileStream 创建文件,还是在创建文件后取消链接文件?

感谢您的帮助。

const fs = require('fs')
const { ReadableMock } = require('stream-mock')
const { assert } = require('chai')

describe.only('fs', () => {
  const expectedPath = './file.txt'
  const input = 'abc'
  const reader = new ReadableMock(input)
  const writer = fs.createWriteStream(expectedPath)

  before((done) => {
    let index = 0
    reader.pipe(writer)
    reader.on('data', () => {
      index++
      if (index === 1) {
        reader.unpipe(writer)
        done()
      }
    })
  })

  after(() => {
    fs.unlinkSync('./file.txt')
  })

  it('should not create file', () => {
    assert.isFalse(fs.existsSync(expectedPath)) // expected true to be false.
  })
})

【问题讨论】:

    标签: node.js stream fs


    【解决方案1】:

    为了实现您想要实现的目标,我将创建一个 PassThrough 流并使用 highWaterMark 告诉我该流何时被填充 - 您不需要太多代码,并且流会给出您不会注意到的开销很小(不是写入磁盘或从 HTTP 读取)。 ;)

    这是我要做的:

      const reader = new ReadableMock(input)
      const checker = new PassThrough({
        highWaterMark: 4096  // or how many bytes you need to gather first
      });
    
      reader
        .once('pause', () => checker.pipe(fs.createWriteStream(expectedPath)))
        .pipe(checker);
    

    这里发生的是:

    • reader 被传送到 checker,它没有连接到任何东西,但它允许它具有高 WaterMark 级别的字节(您可以在那里添加编码以使用字符而不是字节)
    • checker 已暂停,但在管道上 reader 将取消暂停并尝试尽可能多地写入
    • checker 将在返回 false 写入之前接受一些数据,这将在 reader 上发出 pause 事件
    • 监听器现在只创建writer,它是底层文件并通过管道传递checker
    • checker 被取消暂停,因此得到reader

    如果字节数低于highWaterMarkpause 将不会在reader 上发出,因此不会创建文件。

    请注意 - 如果这不是模拟,您可能需要关闭连接并清理,否则您可能会让那些挂起并等待读取,很快您就会耗尽传入连接限制或可用内存。

    【讨论】:

    • 这不是我想要的答案,但要感谢控制流的新技术:D。
    • 好吧,我不相信还有其他方法。一旦调用 createWriteStream,就会安排文件创建。您编写了一个仅返回检查器的简单函数,从外部角度来看,它看起来与调用 createWriteStream 完全相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    相关资源
    最近更新 更多