【问题标题】:Create a duplicated file with fs streams and be able to read it使用 fs 流创建重复文件并能够读取它
【发布时间】:2019-07-31 12:48:49
【问题描述】:

我目前正在尝试使用 Node.js 通过 fs.createWriteStreamfs.createReadStream 函数将文件的内容复制到另一个文件中。

更具体地说,该文件是我想要复制的音乐样本。此外,我希望生成的文件能够像任何音乐或视频一样被播放器读取。这是最后一点,我没有设法执行。这些文件确实是重复的,但是我的播放器不接受生成的文件作为可读文件,就像它以某种方式损坏一样。

我检查了它的内容,这似乎与编程逻辑无关,因为原始文件的数据已正确转置到副本中。这是我的脚本,如果你想看看。

const express = require('express')
const app = express()
const fs = require("fs")
var Promise = require("bluebird")
Promise.promisifyAll(fs)

const path = require('path')
const file1 = path.join(__dirname, 'sample1.wav') // The file to copy
const file2 = path.join(__dirname, 'sample2.wav') // The destination of the new file

app.use(async(req,res,next)=>{

  let file1_stream = await fs.createReadStream(file1)
  let file2_stream = await fs.createWriteStream(file2)
  file2_stream.pipe(file2_stream)
  next()

})

.listen(8080)

我猜这个操作并不像上面所示的复制流并用管道注入那么简单。如果有人知道我在这里想念什么,我全神贯注。提前致谢。

【问题讨论】:

    标签: node.js file copy fs


    【解决方案1】:

    该代码触发了一个错误,您可能没有正确处理该错误,因为您在 express 上使用了异步中间件。

     Error [ERR_STREAM_CANNOT_PIPE]: Cannot pipe, not readable
    

    你必须在readableStream 上使用.pipe 而不是writeableStream

    所以代码应该是:

    file1_stream.pipe(file2_stream);
    

    另外,您无需在fs.createWriteStream 上发送await。它什么也没做。 promisify 适用于回调 API,但 createWriteStreamcreateReadStream 不将回调作为参数。

    app.use((req,res,next)=>{
    
      let readStream = fs.createReadStream(file1);
      let writeStream = fs.createWriteStream(file2);
      readStream.pipe(writeStream);
    
      // Call next once the file was actually copied
      writeStream.on('finish', next);
    
      writeStream.on('error', next); // go to express error handler
      readStream.on('error', next);
    
    });
    

    【讨论】:

    • 我能说什么?它就像一个魅力。我不知道为什么我试图异步所有进程,那是无稽之谈。非常感谢您的回答和非常简洁的解释。
    • 很高兴它成功了!如果您想了解 express & async 中间件,可以查看我的这个答案:stackoverflow.com/questions/51391080/…
    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2021-02-13
    • 2019-08-26
    • 2021-07-11
    • 1970-01-01
    相关资源
    最近更新 更多