2016-07-21 30 views
2

ich nicht in der Lage bin einen Strom in node.js zu schließen ist mein CodeSchließen Strom node.js

 var inp = fs.createReadStream("a/b/c/"+ Name); 
     var out = fs.createWriteStream("a/b/c/"+ Name); 
     inp.pipe(out); 
      inp.close(function(err){ 
       if (err){ 
       console.log(err); 
       } else { 
       inp.unpipe(out); 
       socket.emit('Done',{'Name':name}); 
       console.log('There will be no more data.'); 
       } 
      }); 

Dann habe ich diese Funktion weiter unten in meinem Code, der das Verzeichnis das Verzeichnis von inp löscht

var fse = require("fs-extra"); 
fse.emptyDir("a/b/c/", function(err){ 
    if(err){ 
    console.log(err); 
    } else { 
    console.log("doneaaaa") 
    fse.remove("a/b/c",function(err){ 
     if(err){ 
     console.log(err); 
     } else { 
     console.log('doneaswell'); 
     } 
    }); 
    } 
}); 

und ich bekomme diesen Fehler !!

doneaaaa 
{ [Error: EBUSY: resource busy or locked, unlink 'a/b/c/.nfs000000002ab5000d00000072'] 
    errno: -16, 
    code: 'EBUSY', 
    syscall: 'unlink', 
    path: 'a/b/c/.nfs000000002ab5000d00000072' } 

Das bedeutet, der Stream ist noch offen!

.nfs-Datei wird beim Streaming erstellt richtig, aber sollte Datei nicht löschen, sobald der Stream geschlossen ist?

Was mache ich falsch?

+0

Ich sehe nicht, dass Sie anrufen 'unlink' //' unlinkSync' https://nodejs.org/api/fs.html#fs_fs_unlink_path_callback Was ist 'fse'? – Pogrindis

+0

@Pogrindis Sorry, dass die Frage bearbeitet var fse = require ('fs-extra'); Ich habe versucht, unlink auch aus dem Standard-fs-Modul beendet die mit den gleichen Problemen –

Antwort

0

Sie müssen warten, bis der Callback beendet wird, bevor Sie eine Operation zum Entfernen/Entsperren ausführen. Aus den von Ihnen bereitgestellten Samples sieht das nicht so aus.

+0

konnten Sie bitte ein wenig bitte! Vielen Dank ! –

0

Node.js läuft async, was bedeutet, dass das Löschen des Verzeichnisses während des Streams erfolgt. Stattdessen versuchen, das Löschen setzt innerhalb der Callback so es occours nach:

var inp = fs.createReadStream("a/b/c/"+ Name); 
var out = fs.createWriteStream("a/b/c/"+ Name); 
inp.pipe(out); 
inp.close(function(err){ 
    if (err){ 
    console.log(err); 
    } else { 
    inp.unpipe(out); 
    socket.emit('Done',{'Name':name}); 
    console.log('There will be no more data.'); 
    } 

    var fse = require("fs-extra"); 
    fse.emptyDir("a/b/c/", function(err){ 
    if(err){ 
     console.log(err); 
    } else { 
     console.log("doneaaaa"); 
     fse.remove("a/b/c",function(err){ 
     if(err){ 
      console.log(err); 
     } else { 
      console.log('doneaswell'); 
     } 
     }); 
    } 
    }); 
}); 

Sie haben auch ein Semikolon in einer Zeile fehlen, die ich auch in diesem Code hinzugefügt :)

+0

Ich werde es versuchen, ich muss mein ganzes Upload-Modul jetzt umgestalten. Danke, werde zurück mit Ergebnissen schreiben! –

+0

@ vic-3 Gern geschehen :) Wenn es funktioniert, markiere diese Antwort als akzeptiert, damit es nicht mehr unbeantwortet bleibt :) – Tropic