我目前正在尝试通过 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)
我猜该操作并不像复制一个流并将其注入上面所示的管道那样简单。如果有人知道我在这里想念的是什么,我会很高兴。预先感谢。
答案 0 :(得分:1)
该代码触发了一个错误,您可能无法正确处理该错误,因为您在express上使用了异步中间件。
Error [ERR_STREAM_CANNOT_PIPE]: Cannot pipe, not readable
您必须在.pipe
上使用readableStream
而不是writeableStream
因此代码应为:
file1_stream.pipe(file2_stream);
此外,您无需在await
上fs.createWriteStream
。它什么也没做。 Promisify适用于回调API,但是createWriteStream
和createReadStream
不会将回调作为参数。
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);
});