node.js rimuove il file


Risposte:


805

Penso che tu voglia usare fs.unlink.

Maggiori informazioni su fssono disponibili qui .


137
Credo che provenga dallo standard POSIX. Ma penseresti che potrebbero aggiungere un deletealias!
Nick,

11
@ Nick o un rmFilealias
PixnBits,

9
@PixnBits o un rmalias se hanno rmdirmetodi
Robin

8
per l'utente Meteor, potresti voler usarefs.unlinkSync()
Erdal G.

3
Penso che dovresti fornire un intero esempio, i collegamenti possono cambiare.
Vasilevich,

223

È possibile richiedere lo fs.unlink(path, callback)scollegamento asincrono (2) o lo fs.unlinkSync(path)scollegamento sincrono (2).
Dove si pathtrova il percorso del file che si desidera rimuovere.

Ad esempio, vogliamo rimuovere il discovery.docxfile dalla c:/bookdirectory. Quindi il mio percorso file è c:/book/discovery.docx. Quindi il codice per rimuovere quel file sarà,

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

64

Se si desidera controllare il file prima di eliminare se esiste o meno. Quindi, utilizzare fs.stat o fs.statSync ( Synchronous ) invece di fs.exists. Perché secondo l'ultima documentazione di node.js , fs.existsora obsoleta .

Per esempio:-

 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');
   });  
});

Che cosa succede se controllo che esiste, ma è bloccato da un altro processo - oppure, controllo che esiste, e va bene, ma poi un altro processo lo blocca in modo casuale prima che io sia in grado di eliminarlo. Come posso bloccare subito dopo il controllo? allora non sarei in grado di eliminare come bloccato

4
Nota che fs.exists () è deprecato, ma fs.existsSync () non lo è.
Tim

1
C'è un motivo per cui è deprecato: spesso si crea una condizione di competizione se si verifica l'esistenza di un file prima di eliminarlo. Invece, dovresti solo chiamare fs.unlink, e se il file non esiste, avrai un ENOENTerrore nel callback. Non è necessario controllare prima di provare a scollegare.
ZachB,

@ZachB perché l'operazione di eliminazione viene fs.unlinkeseguita quando il file non esiste, quindi la mia visione è quella di controllare il file prima di rimuoverlo.
Vineet,

Non dovresti controllare se esiste se ci sono più thread o processi che potrebbero utilizzare o tentare di eliminare lo stesso file, nel qual caso il tuo controllo dell'esistenza del file diventerà non valido tra il momento in cui controlli che esiste e il tempo si tenta di eliminarlo. Basta controllare il codice di errore ENOENT nel unlinkcallback. Se si è verificato quell'errore, il file non esisteva. Guarda la risposta di Searene per esempio.
ZachB,

34

Non penso che devi controllare se il file esiste o no, fs.unlinklo controllerò per te.

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`);
    }
});

come posso ottenere il nome dell'immagine precedente nel nostro controller?
Chaudhary,

26

Ecco un piccolo frammento di quello che ho fatto per questo scopo,

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
Cosa succede se il file viene eliminato da altri dopo aver verificato con fs.existse prima di rimuoverlo con fs.unlink? Potrebbe succedere.
Searene,

4
Non verificare se esiste un file prima di tentare di scollegarlo. Basta chiamare unlinke, se non esiste, gestire l' ENOENTerrore. Altrimenti puoi creare una condizione di gara.
ZachB,

9

Come risposta accettata, utilizzare fs.unlink per eliminare i file.

Ma secondo la documentazione di Node.js

utilizzando fs.stat() per verificare l'esistenza di un file prima di chiamare fs.open(), fs.readFile()oppurefs.writeFile() non è raccomandato. Invece, il codice utente dovrebbe aprire / leggere / scrivere direttamente il file e gestire l'errore generato se il file non è disponibile.

Per verificare se esiste un file senza modificarlo in seguito, fs.access()si consiglia.

per verificare che i file possano essere eliminati o meno, utilizzare fs.accessinvece

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

Questa è una buona risposta, con un riferimento Node.js. la maggior parte delle persone utilizzerà unlinkdirettamente perché sa di avere i diritti per eliminare il file. Ma fs.accessè una buona alternativa se devono controllare prima dell'eliminazione. Ma penso che se hanno bisogno di controllare se esiste un file senza manipolarlo in seguito, dovrebbero naturalmente usarlo fs.stat, fs.accesssecondo la mia modesta opinione ha uno scopo diverso.
vdegenne,

il motivo per cui la documentazione sconsiglia di verificare l'esistenza è perché tali informazioni possono cambiare tra la chiamata a fs.stat / fs.access e l'operazione effettiva. Ad esempio, il file potrebbe esistere quando si chiama fs.access e quindi essere eliminato prima di chiamare fs.unlink oppure le autorizzazioni potrebbero cambiare tra le due chiamate. Dato che devi gestire i codici di errore di fs.unlink in quel caso, comunque, non ha senso chiamare fs.stat o fs.access.
Jannis Froese,

6

Di seguito il mio codice che funziona bene.

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

Mi piace questa risposta al meglio perché è la risposta completa e corretta più semplice per coloro che vogliono sapere come eseguire qualcosa dopo il completamento del collegamento e non si preoccupano di personalizzare il messaggio di errore.
Colin Keenan,

perché stai usando __dirname? Mi chiedo se potremmo posizionare un percorso relativo invece del percorso completo?
The Bumpaster,

6

2019 e Nodo 10+ è qui . Di seguito la versione usando sweet async / waitit .

Ora non è più necessario fs.unlinkinserire promesse né utilizzare pacchetti aggiuntivi (comefs-extra ).

Usa l' API Promises nativa di fs .

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);
  }
})();

Qui è fsPromises.unlink specifiche dai documenti Node.

Inoltre, tieni presente che l'API di fs.promises è stata contrassegnata come sperimentale nel Nodo 10.xx (ma funziona del tutto bene, però), e da allora non è più sperimentale 11.14.0.


3

puoi usare del module per rimuovere uno o più file nella directory corrente. la cosa bella è che ti protegge dall'eliminazione della directory di lavoro corrente e superiore.

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

Se devi eliminare più file, questa è un'ottima opzione! Grazie per il suggerimento
Samuel Earl,

2

È possibile utilizzare la funzione fs.unlink (path, callback) . Ecco un esempio del wrapper di funzione con il modello "error-back":

// 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

Rimuovere i file dalla directory che corrisponde a regexp per il nome file. Usato solo fs.unlink - per rimuovere file, fs.readdir - per ottenere tutti i file da una directory

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

È molto facile con fs.

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



-1

Qui il codice in cui è possibile eliminare il file / l'immagine dalla cartella.

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

Dal nodo 7 l'argomento callback non è più facoltativo e genererà un avviso. Passa una funzione vuota se davvero non ti interessa.
jlh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.