node.js supprimer le fichier

Réponses:

805

Je pense que vous voulez utiliser fs.unlink.

Plus d' info sur fspeut être trouvée ici .

pseudo
la source
137
Je crois que cela vient de la norme POSIX. Mais on pourrait penser qu'ils pourraient ajouter un deletealias!
Nick
11
@Nick ou un rmFilealias
PixnBits
9
@PixnBits ou un rmalias s'ils ont des rmdirméthodes
Robin
8
pour l'utilisateur Meteor, vous voudrez peut-être utiliserfs.unlinkSync()
Erdal G.
3
Je pense que vous devriez fournir un exemple complet, les liens peuvent changer.
vasilevich
223

Vous pouvez appeler fs.unlink(path, callback)pour la dissociation asynchrone (2) ou fs.unlinkSync(path)pour la dissociation synchrone (2).
path trouve le chemin de fichier que vous souhaitez supprimer.

Par exemple, nous voulons supprimer le discovery.docxfichier du c:/bookrépertoire. Donc, mon chemin de fichier est c:/book/discovery.docx. Donc, le code pour supprimer ce fichier sera,

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

Si vous souhaitez vérifier le fichier avant de supprimer s'il existe ou non. Utilisez donc fs.stat ou fs.statSync ( synchrone ) au lieu de fs.exists. Parce que selon la dernière documentation node.js , fs.existsdésormais obsolète .

Par exemple:-

 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');
   });  
});
vigne
la source
Que faire si je vérifie qu'il existe, mais qu'il est bloqué par un autre processus - ou que je vérifie qu'il existe, et qu'il est correct, mais qu'un autre processus le bloque aléatoirement avant que je puisse le supprimer. Comment puis-je bloquer directement après vérification? alors je ne pourrais pas supprimer car il est bloqué
4
Notez que fs.exists () est déconseillé, mais fs.existsSync () ne l'est pas.
Tim
1
Il y a une raison pour laquelle il est obsolète: souvent, vous créez une condition de concurrence critique si vous vérifiez qu'un fichier existe avant de le supprimer. Au lieu de cela, vous devez uniquement appeler fs.unlinket si le fichier n'existe pas, vous aurez une ENOENTerreur dans le rappel. Pas besoin de vérifier avant d'essayer de dissocier.
ZachB
@ZachB pourquoi l'opération de suppression fs.unlinks'exécute lorsque le fichier n'existe pas, donc mon avis est que vérifier le fichier avant de le supprimer.
vignoble
Vous ne devez pas vérifier s'il existe si plusieurs threads ou processus peuvent utiliser ou essayer de supprimer le même fichier, auquel cas votre vérification de l'existence du fichier deviendra invalide entre le moment où vous vérifiez qu'il existe et le moment vous essayez de le supprimer. Vérifiez simplement le code d'erreur ENOENT dans le unlinkrappel. Si cette erreur s'est produite, le fichier n'existait pas. Regardez la réponse de Searene par exemple.
ZachB
34

Je ne pense pas que vous ayez à vérifier si le fichier existe ou non, fs.unlinkle vérifiera pour vous.

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`);
    }
});
Searene
la source
comment puis-je obtenir le nom de l'image précédente dans notre contrôleur?
Chaudhary
26

Voici un petit extrait de ce que j'ai fait à cet effet,

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.'));
  }
});
Étranger
la source
4
Async existe est obsolète nodejs.org/api/fs.html#fs_fs_exists_path_callback
Mirodinho
2
Que faire si le fichier est supprimé par d'autres après avoir vérifié avec fs.existset avant de le supprimer fs.unlink? Ça pourrait arriver.
Searene
4
Vous ne devez pas vérifier si un fichier existe avant d'essayer de le dissocier. Appelez simplement unlink, et s'il n'existe pas, gérez l' ENOENTerreur. Sinon, vous pouvez créer une condition de concurrence.
ZachB
9

Comme réponse acceptée, utilisez fs.unlinkpour supprimer des fichiers.

Mais selon la documentation Node.js

Utiliser fs.stat()pour vérifier l'existence d'un fichier avant d'appeler fs.open(), fs.readFile()ou fs.writeFile()n'est pas recommandé. Au lieu de cela, le code utilisateur doit ouvrir / lire / écrire le fichier directement et gérer l'erreur déclenchée si le fichier n'est pas disponible.

Pour vérifier si un fichier existe sans le manipuler par la suite, il fs.access()est recommandé.

pour vérifier que les fichiers peuvent être supprimés ou non, utilisez fs.accessplutôt

fs.access('/etc/passwd', fs.constants.R_OK | fs.constants.W_OK, (err) => {
  console.log(err ? 'no access!' : 'can read/write');
});
jasperjian
la source
C'est une bonne réponse, avec une référence Node.js. la plupart des gens utiliseront unlinkdirectement car ils savent qu'ils ont le droit de supprimer le fichier. Mais fs.accessc'est une bonne alternative s'ils ont besoin de vérifier avant la suppression. Mais je pense que s'ils ont besoin de vérifier si un fichier existe sans le manipuler par la suite, ils devraient naturellement l'utiliser fs.stat, fs.accessa un but différent à mon humble avis.
vdegenne
la raison pour laquelle la documentation recommande de ne pas vérifier l'existence est que ces informations peuvent changer entre votre appel à fs.stat / fs.access et l'opération réelle. Par exemple, le fichier peut exister lorsque vous appelez fs.access, puis être supprimé avant d'appeler fs.unlink, ou les autorisations peuvent changer entre les deux appels. Puisque vous devez gérer les codes d'erreur de fs.unlink dans ce cas, il est inutile d'appeler fs.stat ou fs.access.
Jannis Froese
6

Ci-dessous mon code qui fonctionne bien.

         const fs = require('fs');
         fs.unlink(__dirname+ '/test.txt', function (err) {            
              if (err) {                                                 
                  console.error(err);                                    
              }                                                          
             console.log('File has been Deleted');                           
          });                                                            
Thavaprakash Swaminathan
la source
J'aime le mieux cette réponse, car c'est la réponse la plus simple et complète pour ceux qui veulent savoir comment exécuter quelque chose une fois la dissociation terminée et ne se soucient pas de personnaliser le message d'erreur.
Colin Keenan
pourquoi utilisez-vous __dirname? Je me demande si nous pourrions placer un chemin relatif au lieu d'un chemin complet?
The Bumpaster
6

2019 et Node 10+ est arrivé . Ci-dessous la version utilisant la méthode asynchrone / attente douce .

Désormais, plus besoin de boucler fs.unlinkdans Promises ni d'utiliser des packages supplémentaires (comme fs-extra).

Utilisez simplement l' API fs Promises native .

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

Voici les fsPromises.unlink spécifications des documents Node.

Veuillez également noter que l'API fs.promises est marquée comme expérimentale dans le nœud 10.xx (mais fonctionne parfaitement, cependant) et n'est plus expérimentale depuis 11.14.0.

Artyom Pranovich
la source
3

vous pouvez utiliser del module pour supprimer un ou plusieurs fichiers dans le répertoire courant. ce qui est bien, c'est qu'il vous protège contre la suppression du répertoire de travail actuel et au-dessus.

const del = require('del');
del(['<your pathere here>/*']).then( (paths: any) => {
   console.log('Deleted files and folders:\n', paths.join('\n'));
});
Amazonie
la source
Si vous devez supprimer plusieurs fichiers, c'est une excellente option! Merci pour la suggestion.
Samuel Earl
2

Vous pouvez utiliser la fonction fs.unlink (chemin, rappel) . Voici un exemple de l'encapsuleur de fonctions avec un motif "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');
    }
  })
};

Oleksii Trekhleb
la source
2

Supprimez les fichiers du répertoire correspondant à l'expression rationnelle pour le nom de fichier. Utilisé uniquement fs.unlink - pour supprimer le fichier, fs.readdir - pour obtenir tous les fichiers d'un répertoire

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]) 
        }
    }
});
Xenia Lvova
la source
2

C'est très simple avec fs.

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

Voici le code où vous pouvez supprimer le fichier / l'image du dossier.

var fs = require('fs'); 
Gallery.findById({ _id: req.params.id},function(err,data){ 
    if (err) throw err;
    fs.unlink('public/gallery/'+data.image_name);
 });
Mahesh singh chouhan
la source
Depuis le nœud 7, l'argument de rappel n'est plus facultatif et entraînera un avertissement. Passez une fonction vide si vous ne vous en souciez vraiment pas.
jlh