node.js удалить файл


Ответы:


805

Я думаю, что вы хотите использовать fs.unlink.

Более подробную информацию о fsможно найти здесь .


137
Я считаю, что это исходит из стандарта POSIX. Но вы могли бы подумать, что они могли бы добавить deleteпсевдоним!
— Ник

11
@ Ник или rmFileпсевдоним
— PixnBits

9
@PixnBits или rmпсевдоним, если у них есть rmdirметоды
— Робин

8
для пользователя Meteor, вы можете использоватьfs.unlinkSync()
— Erdal G.

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

223

Вы можете вызвать fs.unlink(path, callback)Asynchronous unlink (2) или fs.unlinkSync(path)Synchronous unlink (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 почему операция удаления fs.unlinkвыполняется, когда файл не существует, поэтому я считаю, что проверять файл перед удалением.
— Винет

Вы не должны проверять, существует ли он, если существует несколько потоков или процессов, которые могут использовать или пытаться удалить один и тот же файл, и в этом случае ваша проверка того, что файл существует, станет недействительной между временем проверки того, что он существует, и временем Вы пытаетесь удалить его. Просто проверьте код ошибки ENOENT в обратном вызове unlink. Если эта ошибка произошла, файл не существует. Посмотрите на ответ Сирена, например.
— ЗакБ

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
Асинхронность существует устарела nodejs.org/api/fs.html#fs_fs_exists_path_callback
— Mirodinho

2
Что если файл будет удален другими после того, как вы проверили его, fs.existsа затем удалили fs.unlink? Это могло случиться.
— Searene

4
Вы не должны проверять, существует ли файл, прежде чем пытаться отсоединить его. Просто позвоните unlink, и если он не существует, обработайте ENOENTошибку. В противном случае вы можете создать условия гонки.
— ЗакБ

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по моему скромному мнению, другое назначение.
— vdegenne

причина, по которой документация рекомендует не проверять наличие, заключается в том, что эта информация может меняться между вашим вызовом 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');                           
          });                                                            

Мне нравится этот ответ больше всего, потому что это самый простой и правильный ответ для тех, кто хочет знать, как запустить что-то после завершения unlink и не заботится о настройке сообщения об ошибке.
— Колин Кинэн

почему вы используете __dirname? Интересно, могли бы мы разместить относительный путь вместо полного пути?
— Бампер

6

2019 и Узел 10+ уже здесь . Ниже версии используется сладкий способ async / await .

Теперь не нужно больше оборачиваться fs.unlinkв Promises или использовать дополнительные пакеты (например 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 docs.

Также обратите внимание, что API-интерфейс fs.promises помечен как экспериментальный в Node 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 (путь, обратный вызов) . Вот пример обёртки функции с шаблоном «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

Удалите файлы из каталога, который соответствует регулярному выражению для имени файла. Используется только 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

Это очень легко с фс.

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, аргумент обратного вызова больше не является обязательным и приведет к предупреждению. Передайте пустую функцию, если вы действительно не заботитесь об этом.
— 17
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.