node.js删除文件


Answers:


804

我想你要用fs.unlink

有关更多信息,请fs参见此处


137
我相信它来自POSIX标准。但您认为他们可以添加delete别名!
尼克

11
@Nick或rmFile别名
PixnBits,2015年

9
@PixnBits或rm别名(如果它们具有rmdir方法)
Robin

8
对于Meteor用户,您可能需要使用fs.unlinkSync()
Erdal G.

3
我认为您应该提供一个完整的示例,链接可以更改。
vasilevich

222

您可以要求fs.unlink(path, callback)异步unlink(2)或fs.unlinkSync(path)同步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.statfs.statSyncSynchronous)代替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()。
蒂姆(Tim)

1
有一个不推荐使用的原因:通常,如果在删除文件之前检查文件是否存在,就会创建竞争条件。相反,您仅应调用fs.unlink,如果文件不存在,ENOENT则回调中将出现错误。尝试取消链接之前无需检查。
ZachB

@ZachB为什么fs.unlink在文件不存在时执行删除操作,所以我的看法是在删除文件之前先检查文件。
vineet

如果有多个线程或进程正在使用或尝试删除同一文件,则不应该检查该文件是否存在,在这种情况下,检查文件存在的时间与时间之间的检查将变得无效。您尝试将其删除。只需检查unlink回调中的ENOENT错误代码即可。如果发生该错误,则该文件不存在。例如,看一下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`);
    }
});

如何在我们的控制器中获取以前的图像名称?
Chaudhary

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


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.statfs.access在我的拙见中有不同的目的。
vdegenne

该文档建议不要检查是否存在的原因是,该信息可能会在您对fs.stat / fs.access的调用与实际操作之间发生变化。例如,当您调用fs.access时文件可能存在,然后在调用fs.unlink之前被删除,或者两次调用之间的权限可能会更改。由于在这种情况下,您必须处理fs.unlink的错误代码,因此调用fs.stat或fs.access毫无意义。
Jannis Froese

6

在我的代码下面,这很好用。

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

我最喜欢这个答案,因为对于那些想知道在取消链接完成后如何运行某些东西而又不关心自定义错误消息的人来说,这是最简单的完整正确的答案。
Colin Keenan '18

为什么使用__dirname?我想知道我们是否可以放置相对路径而不是完整路径?
The Bumpaster

6

2019和Node 10+在这里。下面的版本使用甜蜜的异步/等待方式。

现在无需包装fs.unlink到Promises中,也不再需要使用其他软件包(例如fs-extra)。

只需使用本机fs Promises API即可

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的规格。

另请注意,fs.promises API在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(path,callback)函数。这是带有“错误返回”模式的函数包装器的示例:

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

从目录中删除与regexp匹配的文件名文件。仅使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.