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.