node.js видалити файл


Відповіді:


804

Я думаю, ти хочеш використовувати fs.unlink.

Більше інформації fsможна знайти тут .


137
Я вважаю, що це походить від стандарту POSIX. Але ти думаєш, що вони можуть додати deleteпсевдонім!
Нік

11
@Nick or rmFilealias
PixnBits

9
@PixnBits або rmпсевдонім, якщо у них є rmdirметоди
Робін

8
для користувача Meteor, можливо, ви захочете скористатисьfs.unlinkSync()
Erdal G.

3
Я думаю, ви повинні навести цілий приклад, посилання можуть змінюватися.
васілевич

222

Ви можете закликати fs.unlink(path, callback)до асинхронного відключення (2) або fs.unlinkSync(path)для синхронного відключення (2).
Де pathфайл-шлях, який потрібно видалити.

Наприклад, ми хочемо видалити discovery.docxфайл з c:/bookкаталогу. Отже, мій шлях до файлів є c:/book/discovery.docx. Отже код для видалення цього файлу буде,

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

64

Якщо ви хочете перевірити файл, перш ніж видалити, чи існує він чи ні. Отже, використовуйте fs.stat або fs.statSync ( Synchronous ) замість fs.exists. Тому що в відповідно до останньої Node.js документації , в fs.existsданий час НЕ рекомендується .

Наприклад:-

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

Що робити, якщо я перевіряю, що він існує, але його блокує інший процес - або я перевіряю, що він існує, і це добре, але потім інший процес випадковим чином блокує його, перш ніж я можу видалити. Як я можу заблокувати відразу після перевірки? тоді я не зможу видалити його як заблокований

4
Зауважте, що fs.exists () застаріле, але fs.existsSync () - ні.
Тім

1
Причина є застарілою: часто ви створюєте перегоновий стан, якщо перевіряєте, чи існує файл, перш ніж видаляти його. Натомість вам слід дзвонити лише fs.unlink, і якщо файл не існує, ви отримаєте ENOENTпомилку в зворотному дзвінку . Не потрібно перевіряти, перш ніж намагатися від’єднатися.
ZachB

@ZachB чому операцію видалення fs.unlinkвиконувати, коли файл не існував, тому я вважаю, що перевірити файл перед видаленням.
виноград

Ви не повинні перевіряти, чи існує він, чи існує декілька потоків або процесів, які можуть використовувати або намагаються видалити один і той же файл, і в такому випадку ваша перевірка наявності цього файлу стане недійсною між часом, коли ви перевірите його наявність та час ви намагаєтесь її видалити. Просто перевірте наявність ENOENT коду помилки у unlinkзворотному дзвінку. Якщо виникла помилка, файл не існував. Подивіться, наприклад, відповідь Searene.
ZachB

34

Я не думаю, що вам доведеться перевіряти, чи існує файл чи ні, fs.unlinkвін перевірить його вам.

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

як я можу отримати попереднє ім’я зображення в нашому контролері?
Чадхарі

26

Ось невеликий фрагмент, який я зробив для цієї мети,

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

4
Async існує - застарілий nodejs.org/api/fs.html#fs_fs_exists_path_callback
Mirodinho

2
Що робити, якщо файл видаляється іншими користувачами після реєстрації fs.existsта перед тим, як видалити її fs.unlink? Це могло статися.
Searene

4
Не слід перевіряти, чи існує файл, перш ніж намагатися від’єднати його. Просто зателефонуйте unlink, а якщо його немає, обробіть ENOENTпомилку. Інакше ви можете створити умову гонки.
ZachB

9

Як прийняту відповідь, використовуйте fs.unlinkдля видалення файлів.

Але відповідно до документації Node.js

Використання fs.stat()для перевірки існування файлу перед викликом fs.open(), fs.readFile()або fs.writeFile()не рекомендується. Натомість, код користувача повинен відкривати / читати / записувати файл безпосередньо та обробляти помилку, що виникає, якщо файл недоступний.

Щоб перевірити, чи існує файл, не маніпулюючи ним згодом, fs.access()рекомендується.

для перевірки файлів можна видалити чи ні, використовуйте fs.accessзамість цього

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

Це хороша відповідь із посиланням на Node.js. більшість людей unlinkбезпосередньо використовуватимуть їх, оскільки знають, що мають права на видалення файлу. Але fs.accessце хороша альтернатива, якщо їх потрібно перевірити перед видаленням. Але я думаю, якщо їм потрібно перевірити, чи існує якийсь файл, не маніпулюючи ним згодом, вони, природно, повинні використовувати fs.stat, fs.accessна мою скромну думку , має інше призначення.
вдегенне

Причина, через яку документація рекомендує не перевіряти наявність, полягає в тому, що ця інформація може змінюватися між вашим викликом до fs.stat / fs.access і фактичною операцією. Наприклад, файл може існувати під час виклику fs.access, а потім видалятися перед тим, як викликати fs.unlink, або дозволи можуть змінюватися між двома дзвінками. Оскільки в такому випадку вам доведеться обробляти коди помилок fs.unlink, то не має сенсу викликати fs.stat або fs.access.
Jannis

6

Тут під моїм кодом, який чудово працює.

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

Мені подобається ця відповідь найкраще, тому що це найпростіша повна і правильна відповідь для тих, хто хоче знати, як виконати щось після завершення від’єднання і не хвилює налаштування повідомлення про помилку.
Колін Кінан

чому ви використовуєте __dirname? Цікаво, чи можна було б розмістити відносний шлях замість повного шляху?
Bumpaster

6

2019 і Node 10+ тут . Нижче версії, використовуючи солодкий спосіб асинхронізації / очікування .

Тепер більше не потрібно зациклюватися fs.unlinkна Обіцянках і більше не використовувати додаткові пакети (як fs-extra).

Просто використовуйте рідний API fs Promises .

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

Ось fsPromises.unlink специфікація від документів Node.

Також зауважте, що API fs.promises позначений як експериментальний у вузлі 10.xx (однак він працює зовсім чудово), але з цього часу вже не експериментальний 11.14.0.


3

ви можете використовувати модуль del для видалення одного або декількох файлів у поточному каталозі. що приємно в тому, що захищає вас від видалення поточного робочого каталогу та вище.

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

Якщо вам потрібно видалити кілька файлів, це чудовий варіант! Дякую за пропозицію.
Самуель граф

2

Ви можете використовувати функцію fs.unlink (шлях, зворотний виклик) . Ось приклад функціональної обгортки з малюнком "відхилення помилок":

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

Видаліть файли з каталогу, який збігається з регулярним виразом для імені файлу. Використовується лише fs.unlink - для видалення файлу, fs.readdir - для отримання всіх файлів з каталогу

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

З fs це дуже просто.

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



-1

Тут код, з якого можна видалити файл / зображення з папки.

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

Оскільки вузол 7, аргумент зворотного виклику більше не є обов'язковим і призведе до попередження. Передайте порожню функцію, якщо ви її справді не хвилюєте.
jlh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.