node.js Datei entfernen


Antworten:


804

Ich denke du willst es benutzen fs.unlink.

Weitere Infos zu fsfinden Sie hier .


137
Ich glaube, es kommt vom POSIX-Standard. Aber Sie würden denken, sie könnten einen deleteAlias hinzufügen !
Nick

11
@ Nick oder ein rmFileAlias
PixnBits

9
@PixnBits oder ein rmAlias, wenn sie rmdirMethoden haben
Robin

8
für Meteor Benutzer können Sie verwendenfs.unlinkSync()
Erdal G.

3
Ich denke, Sie sollten ein ganzes Beispiel geben, Links können sich ändern.
Vasilevich

223

Sie können die fs.unlink(path, callback)asynchrone Verknüpfung (2) oder die fs.unlinkSync(path)synchrone Verknüpfung (2) aufrufen .
Wo pathist der Dateipfad, den Sie entfernen möchten?

Zum Beispiel möchten wir die discovery.docxDatei aus dem c:/bookVerzeichnis entfernen . Mein Dateipfad ist also c:/book/discovery.docx. Der Code zum Entfernen dieser Datei lautet also:

var fs = require('fs');
var filePath = 'c:/book/discovery.docx'; 
fs.unlinkSync(filePath);

64

Wenn Sie die Datei vor dem Löschen überprüfen möchten, ob sie vorhanden ist oder nicht. Verwenden Sie also fs.stat oder fs.statSync ( Synchronous ) anstelle von fs.exists. Da nach dem neuesten Stand node.js Dokumentation , fs.existsjetzt veraltet .

Zum Beispiel:-

 fs.stat('./server/upload/my.csv', function (err, stats) {
   console.log(stats);//here we got all information of file in stats variable

   if (err) {
       return console.error(err);
   }

   fs.unlink('./server/upload/my.csv',function(err){
        if(err) return console.log(err);
        console.log('file deleted successfully');
   });  
});

Was ist, wenn ich überprüfe, ob es existiert, aber von einem anderen Prozess blockiert wird - oder ob ich überprüfe, ob es existiert und ob es in Ordnung ist, aber dann blockiert ein anderer Prozess es zufällig, bevor ich es löschen kann. Wie kann ich direkt nach der Überprüfung blockieren? dann würde ich nicht in der Lage sein, als seine blockiert zu löschen

4
Beachten Sie, dass fs.exists () veraltet ist, fs.existsSync () jedoch nicht.
Tim

1
Es gibt einen Grund, warum es veraltet ist: Oft erstellen Sie eine Race-Bedingung, wenn Sie überprüfen, ob eine Datei vorhanden ist, bevor Sie sie löschen. Stattdessen sollten Sie nur aufrufen fs.unlink. Wenn die Datei nicht vorhanden ist, ENOENTwird im Rückruf ein Fehler angezeigt. Sie müssen dies nicht überprüfen, bevor Sie versuchen, die Verknüpfung aufzuheben.
ZachB

@ZachB Warum wird der Löschvorgang ausgeführt fs.unlink, wenn die Datei nicht vorhanden ist ?
Vineet

Sie sollten nicht überprüfen, ob es vorhanden ist, wenn mehrere Threads oder Prozesse dieselbe Datei verwenden oder versuchen, sie zu löschen. In diesem Fall wird Ihre Überprüfung, ob die Datei vorhanden ist, zwischen dem Zeitpunkt, zu dem Sie überprüfen, ob sie vorhanden ist, und dem Zeitpunkt ungültig Sie versuchen es zu löschen. Überprüfen Sie einfach den ENOENT-Fehlercode im unlinkRückruf. Wenn dieser Fehler aufgetreten ist, war die Datei nicht vorhanden. Schauen Sie sich zum Beispiel Searenes Antwort an.
ZachB

34

Ich glaube nicht, dass Sie überprüfen müssen, ob eine Datei vorhanden ist oder nicht, fs.unlinkwird sie für Sie überprüfen.

fs.unlink('fileToBeRemoved', function(err) {
    if(err && err.code == 'ENOENT') {
        // file doens't exist
        console.info("File doesn't exist, won't remove it.");
    } else if (err) {
        // other errors, e.g. maybe we don't have enough permission
        console.error("Error occurred while trying to remove file");
    } else {
        console.info(`removed`);
    }
});

Wie kann ich den vorherigen Bildnamen in unserem Controller erhalten?
Chaudhary

26

Hier ist ein kleiner Ausschnitt von mir, den ich zu diesem Zweck gemacht habe:

var fs = require('fs');
var gutil = require('gulp-util');

fs.exists('./www/index.html', function(exists) {
  if(exists) {
    //Show in green
    console.log(gutil.colors.green('File exists. Deleting now ...'));
    fs.unlink('./www/index.html');
  } else {
    //Show in red
    console.log(gutil.colors.red('File not found, so not deleting.'));
  }
});


2
Was ist, wenn die Datei von anderen gelöscht wird, nachdem Sie mit fs.existsund vor dem Entfernen mit überprüft haben fs.unlink? Es könnte passieren.
Searene

4
Sie sollten nicht überprüfen, ob eine Datei vorhanden ist, bevor Sie versuchen, die Verknüpfung aufzuheben. Rufen Sie einfach an unlinkund behandeln Sie den ENOENTFehler , falls er nicht vorhanden ist . Andernfalls können Sie eine Rennbedingung erstellen.
ZachB

9

Verwenden Sie als akzeptierte Antwort, fs.unlinkum Dateien zu löschen.

Aber laut Node.js Dokumentation

Verwenden Sie fs.stat()diese Option, um vor dem Aufrufen zu prüfen, ob eine Datei vorhanden ist fs.open(), fs.readFile()oder dies fs.writeFile()wird nicht empfohlen. Stattdessen sollte der Benutzercode die Datei direkt öffnen / lesen / schreiben und den Fehler behandeln, der ausgelöst wird, wenn die Datei nicht verfügbar ist.

Es fs.access()wird empfohlen, zu überprüfen, ob eine Datei vorhanden ist, ohne sie anschließend zu bearbeiten.

Um zu überprüfen, ob Dateien gelöscht werden können oder nicht, verwenden Sie fs.accessstattdessen

fs.access('/etc/passwd', fs.constants.R_OK | fs.constants.W_OK, (err) => {
  console.log(err ? 'no access!' : 'can read/write');
});

Dies ist eine gute Antwort mit einer Node.js-Referenz. Die meisten Benutzer verwenden unlinkdirekt, weil sie wissen, dass sie Rechte zum Löschen der Datei haben. Dies fs.accessist jedoch eine gute Alternative, wenn sie vor dem Löschen überprüft werden müssen. Aber ich denke, wenn sie überprüfen müssen, ob eine Datei existiert, ohne sie danach zu manipulieren, sollten sie natürlich verwenden fs.stat, fs.accesshat meiner bescheidenen Meinung nach einen anderen Zweck.
Vdegenne

Der Grund, warum in der Dokumentation davon abgeraten wird, auf Existenz zu prüfen, liegt darin, dass sich diese Informationen zwischen Ihrem Aufruf von fs.stat / fs.access und dem tatsächlichen Vorgang ändern können. Beispielsweise kann die Datei vorhanden sein, wenn Sie fs.access aufrufen und dann gelöscht werden, bevor Sie fs.unlink aufrufen, oder die Berechtigungen können sich zwischen den beiden Aufrufen ändern. Da Sie in diesem Fall sowieso mit den Fehlercodes von fs.unlink umgehen müssen, macht es keinen Sinn, fs.stat oder fs.access aufzurufen.
Jannis Froese

6

Hier unten mein Code, der gut funktioniert.

         const fs = require('fs');
         fs.unlink(__dirname+ '/test.txt', function (err) {            
              if (err) {                                                 
                  console.error(err);                                    
              }                                                          
             console.log('File has been Deleted');                           
          });                                                            

Diese Antwort gefällt mir am besten, weil sie die einfachste vollständige und korrekte Antwort für diejenigen ist, die wissen möchten, wie etwas ausgeführt wird, nachdem die Verknüpfung abgeschlossen wurde, und sich nicht um das Anpassen der Fehlermeldung kümmern möchten.
Colin Keenan

Warum benutzt du __dirname? Ich frage mich, ob wir einen relativen Pfad anstelle eines vollständigen Pfades platzieren könnten.
The Bumpaster

6

2019 und Node 10+ ist da . Unterhalb der Version mit süßem Async / Warten Weg.

Jetzt müssen Sie sich nicht mehr fs.unlinkin Promises einwickeln oder zusätzliche Pakete (wie fs-extra) verwenden.

Verwenden Sie einfach die native fs Promises API .

const fs = require('fs').promises;

(async () => {
  try {
    await fs.unlink('~/any/file');
  } catch (e) {
    // file doesn't exist, no permissions, etc..
    // full list of possible errors is here 
    // http://man7.org/linux/man-pages/man2/unlink.2.html#ERRORS
    console.log(e);
  }
})();

Hier ist eine fsPromises.unlink Spezifikation aus Node-Dokumenten.

Beachten Sie auch, dass die fs.promises-API in Node 10.xx als experimentell markiert ist (funktioniert aber völlig in Ordnung) und seitdem nicht mehr experimentell ist 11.14.0.


3

Mit dem del- Modul können Sie eine oder mehrere Dateien im aktuellen Verzeichnis entfernen. Das Schöne daran ist, dass Sie vor dem Löschen des aktuellen Arbeitsverzeichnisses und höher geschützt sind.

const del = require('del');
del(['<your pathere here>/*']).then( (paths: any) => {
   console.log('Deleted files and folders:\n', paths.join('\n'));
});

Wenn Sie mehrere Dateien löschen müssen, ist dies eine großartige Option! Vielen Dank für den Vorschlag.
Samuel Earl

2

Sie können die Funktion fs.unlink (Pfad, Rückruf) verwenden. Hier ist ein Beispiel für den Funktions-Wrapper mit "Fehler-Zurück" -Muster:

// Dependencies.
const fs = require('fs');

// Delete a file.
const deleteFile = (filePath, callback) => {
  // Unlink the file.
  fs.unlink(filePath, (error) => {
    if (!error) {
      callback(false);
    } else {
      callback('Error deleting the file');
    }
  })
};


2

Entfernen Sie Dateien aus dem Verzeichnis, das mit regulärem Ausdruck für Dateinamen übereinstimmt. Wird nur fs.unlink verwendet, um Dateien zu entfernen, fs.readdir, um alle Dateien aus einem Verzeichnis abzurufen

var fs = require('fs');
const path = '/path_to_files/filename.anyextension'; 

const removeFile = (fileName) => {
    fs.unlink(`${path}${fileName}`, function(error) {
        if (error) {
            throw error;
        }
        console.log('Deleted filename', fileName);
    })
}

const reg = /^[a-zA-Z]+_[0-9]+(\s[2-4])+\./

fs.readdir(path, function(err, items) {
    for (var i=0; i<items.length; i++) {
        console.log(items[i], ' ', reg.test(items[i]))
        if (reg.test(items[i])) {
           console.log(items[i])
           removeFile(items[i]) 
        }
    }
});

2

Mit fs ist es sehr einfach.

var fs = require('fs');
try{
 var sourceUrls = "/sampleFolder/sampleFile.txt";
 fs.unlinkSync(sourceUrls);
}catch(err){
 console.log(err);
}



-1

Hier der Code, mit dem Sie Datei / Bild aus Ordner löschen können.

var fs = require('fs'); 
Gallery.findById({ _id: req.params.id},function(err,data){ 
    if (err) throw err;
    fs.unlink('public/gallery/'+data.image_name);
 });

Seit Knoten 7 ist das Rückrufargument nicht mehr optional und führt zu einer Warnung. Übergeben Sie eine leere Funktion, wenn Sie sich wirklich nicht darum kümmern.
Uhr
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.