使用fs流创建重复的文件并能够读取它

时间:2019-03-09 19:07:53

标签: node.js file copy fs

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

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

我检查了它的内容,似乎没有一个编程逻辑问题,因为原始文件的数据已正确地转置到副本中。这是我的脚本,如果您想看一看。

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)

我猜该操作并不像复制一个流并将其注入上面所示的管道那样简单。如果有人知道我在这里想念的是什么,我会很高兴。预先感谢。

1 个答案:

答案 0 :(得分:1)

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

 Error [ERR_STREAM_CANNOT_PIPE]: Cannot pipe, not readable

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

因此代码应为:

file1_stream.pipe(file2_stream);

此外,您无需在awaitfs.createWriteStream。它什么也没做。 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);

});