Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用fs streams创建一个复制文件,并能够读取它_Node.js_File_Copy_Fs - Fatal编程技术网

Node.js 使用fs streams创建一个复制文件,并能够读取它

Node.js 使用fs streams创建一个复制文件,并能够读取它,node.js,file,copy,fs,Node.js,File,Copy,Fs,我目前正试图通过fs.createWriteStream和fs.createReadStream函数使用Node.js将文件内容复制到另一个文件中 更具体地说,该文件是一个音乐样本,我想复制。此外,我希望生成的文件能够像任何音乐或视频一样被播放器读取。这是我没有做到的最后一点。这些文件确实是重复的,但是我的播放器不接受生成的文件作为可读文件,就像它被破坏了一样 我检查了它的内容,在那里它似乎不是一个编程逻辑问题,因为原始文件的数据已经正确地转换到副本中。这是我的剧本,如果你想看的话 const

我目前正试图通过fs.createWriteStreamfs.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)

我想操作并不像复制一个流并用上面所示的管道注入它那样简单。如果有人知道我在这里遗漏了什么,我洗耳恭听。提前感谢。

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

 Error [ERR_STREAM_CANNOT_PIPE]: Cannot pipe, not readable
您必须在
可读流
上使用
.pipe
,而不是在
可写流

因此,代码应该是:

file1_stream.pipe(file2_stream);
另外,您不需要在
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);

});

我能说什么?它就像一个符咒。我不知道为什么我试图异步所有的进程,那是胡说八道。非常感谢您的回答和非常简洁的解释。很高兴它奏效了!。如果您想了解express&async中间件,可以查看我的回答: