gpt4 book ai didi

javascript - 删除文件时停止 fs.createWriteStream 创建可写流

转载 作者:搜寻专家 更新时间:2023-11-01 00:01:26 60 4
gpt4 key购买 nike

伙计们:我正在创建一个 Angular/Node 应用程序,用户可以在其中通过选择相关缩略图来下载文件。

  • 下载文件时,会显示一个包含下载进度的小列表 - 使用 status-bar .
  • 下载文件后会显示一条成功消息。
  • 列表中的每个项目都有一个删除按钮,单击该按钮会删除文件。所有这一切都很好。

问题:类似于this post - 单击删除按钮时,想法是停止下载 - 这就是为什么我认为我只是删除文件。

但是,我使用的是 fs.createWriteStream,当文件被删除时,流似乎继续,无论文件是否不存在。然后这会导致 file.on('finish', function() { 状态启动并显示成功消息。

为了解决这个问题,我在 finish 状态启动时检查文件路径是否存在,以便正确显示成功消息。这感觉很糟糕,尤其是在下载大文件时。

有没有办法在删除文件时取消流的处理?

最佳答案

根据您的评论“是的,就像那样”,我有一个问题。您显然是在客户端系统中创建文件,并写入流中。你是如何从浏览器做的?您是否正在使用任何可以让您在浏览器中访问 Node 核心模块的 API?喜欢browserify .

话虽如此,如果我的理解是正确的,你可以通过以下方式实现

var http = require("http"),
fs = require("fs"),
stream = require("stream"),
util = require("util"),
abortStream=false, // When user click on delete, update this flag to true
ws,
Transform;

ws = fs.createWriteStream('./op.jpg');

// Transform streams read input, process data [n times], output processed data
// readStream ---pipe---> transformStream1 ---pipe---> ...transformStreamn ---pipe---> outputStream
// @api https://nodejs.org/api/stream.html#stream_class_stream_transform
// @exmpl https://strongloop.com/strongblog/practical-examples-of-the-new-node-js-streams-api/
Transform = stream.Transform || require("readable-stream").Transform;

function InterruptedStream(options){
if(!(this instanceof InterruptedStream)){
return new InterruptedStream;
}

Transform.call(this, options);
}

util.inherits(InterruptedStream, Transform);

InterruptedStream.prototype._transform = function (chunkdata, encoding, done) {
// This is just for illustration, giving you the idea
// Do not hard code the condition here.
// Suggested to give the condition during constructor call, may be
if(abortStream===true){
// Take care of this part.
// Your logic might try to write in the stream after it is closed.
// You can catch the exception but before that try not to write in the first place
this.end(); // Stops the stream
}
this.push(chunkdata, encoding);
done();
};


var is=new InterruptedStream();
is.pipe(ws);

// Download large file
http.get("http://www.zastavki.com/pictures/1920x1200/2011/Space_Huge_explosion_031412_.jpg", function(res) {
res.on('data', function(data) {
is.write(data);
// Simulates click on delete button
setTimeout(function(){
abortStream=false;
res.destroy();
// Delete the file, I think you have the logic in place
}, 2000);
}).on('end', function() {
console.log("end");
});
});

上面的代码片段给出了如何完成的粗略概念。您可以复制粘贴它,运行(它会起作用)并进行更改。

如果我们不在同一页面上,请告诉我,我会尽量纠正我的回答。

关于javascript - 删除文件时停止 fs.createWriteStream 创建可写流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30074633/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com