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

时间:2015-05-06 10:52:00

标签: javascript node.js

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

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

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

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

要解决此问题,我会检查finish状态启动时文件路径是否存在,以便正确显示成功消息。这感觉非常hacky,特别是在下载大文件时。

有没有办法在删除文件时取消流进度?

2 个答案:

答案 0 :(得分:1)

在您的评论'是,就像那样'之后,我有一个问题。您显然是在客户端系统中创建文件,并在流中编写。你是如何从浏览器中做到的?您是否使用任何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");
        });
    });

上面的代码片段粗略地介绍了如何完成它。您可以复制粘贴它,运行(它将起作用)并进行更改。

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

答案 1 :(得分:0)

我认为您可以在删除文件时发出事件并在

中捕获该事件
var wt = fs.createWriteStream();
wt.on('eventName',function(){
                wt.emit('close');                                     
})

这将关闭你的writableStream。

应该从客户端触发

和删除事件。