Node.js 删除文件

809
25个回答

1067

我认为你想要使用 fs.unlink

这里可以找到更多关于fs的信息。


188
我认为它源自POSIX标准。但你可能会认为他们可以添加一个delete别名! - Nick
15
@Nick或'rmFile'别名 - PixnBits
13
如果他们有rmdir方法,可以使用@PixnBits或rm别名。 - Robin
13
对于Meteor用户,您可能希望使用fs.unlinkSync() - Erdal G.
8
我认为你应该提供一个完整的示例,因为链接可能会发生变化。 - vasilevich
显示剩余2条评论

349
你可以调用fs.unlink(path, callback)以异步方式unlink(2),或者使用fs.unlinkSync(path)以同步方式unlink(2)。
其中path是你想要删除的文件路径。
例如,我们想从c:/book目录中删除discovery.docx文件。因此我的文件路径是c:/book/discovery.docx。因此,删除该文件的代码将是:
var fs = require('fs');
var filePath = 'c:/book/discovery.docx'; 
fs.unlinkSync(filePath);

94
如果您想在删除文件之前检查文件是否存在,请使用 fs.stat 或者 fs.statSync同步方式),而不是使用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');
   });  
});

如果我检查它是否存在,但被另一个进程阻止了,或者我检查它是否存在,一切正常,但然后另一个进程在我能够删除之前随机阻止了它。我如何在检查后立即阻止?那么我不就无法删除因为它被阻止了吗? - user6765872
7
注意,fs.exists()已被弃用,但fs.existsSync()并未被弃用。 - Tim
6
"过时的原因是,如果在删除文件之前检查其是否存在,则往往会创建竞争条件。相反,您应该只调用fs.unlink,如果文件不存在,则回调中将出现一个ENOENT错误。无需在尝试取消链接之前进行检查。" - ZachB
@ZachB 为什么在文件不存在时执行删除操作 fs.unlink,所以我的看法是在删除之前检查文件。 - vineet
如果有多个线程或进程可能正在使用或尝试删除同一个文件,则不应检查它是否存在,否则在您检查它是否存在和尝试删除它之间,您的检查将变得无效。只需在unlink回调中检查ENOENT错误代码即可。如果发生该错误,则文件不存在。请参考Searene的答案示例。 - ZachB
1
这种方法的一个大问题是它会为非异常情况抛出错误,这使得调试变得非常麻烦。在我看来,Node 应该采取不同的方法。 - nicodemus13

58

4
文档中说force的意思是:force <boolean> 当为true时,如果路径不存在,异常将被忽略。默认值:false。 - ccalvert
跳转到这个答案,它缺少一些上下文。需要在开头添加 var fs = require('fs'); - Michael
使用fs/promisesawait fs.rm(resultsFile, { force: true })可能更好,以避免同步调用。 - undefined

55

我认为你不需要检查文件是否存在,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`);
    }
});

我该如何在我们的控制器中获取先前的图像名称? - Apurv Chaudhary

31

这是我为此目的创建的一个小片段,

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
异步方法 fs.exists 已被弃用,详情请见 https://nodejs.org/api/fs.html#fs_fs_exists_path_callback - Mirodinho
3
如果在您使用fs.exists检查文件并在使用fs.unlink删除文件之前,其他人删除了该文件,会发生什么?这种情况是可能发生的。 - Searene
4
在尝试删除文件之前,不应该先检查文件是否存在。只需调用 unlink,如果文件不存在,则处理 ENOENT 错误即可。否则会出现竞态条件。 - ZachB

24

2019和Node 10+已经到来。以下是使用sweet async/await方式的版本。

现在不需要再将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);
  }
})();

这里是来自Node文档的fsPromises.unlink规范。

此外,请注意在Node 10.x.x中,fs.promises API标记为实验性(但完全可用),并且自11.14.0版本以后不再是实验性的。


16

您可以做以下事情

const deleteFile = './docs/deleteme.txt'
if (fs.existsSync(deleteFile)) {
    fs.unlink(deleteFile, (err) => {
        if (err) {
            console.log(err);
        }
        console.log('deleted');
    })
}

异步删除文件或符号链接。完成回调函数只接收可能的异常参数而没有其他参数。

fs.unlink()不能用于目录,无论是空目录还是非空目录。要删除目录,请使用fs.rmdir()。

更多详情


13

简单而同步

if (fs.existsSync(pathToFile)) {
  fs.unlinkSync(pathToFile)
}

10

下面是我的代码,它能够正常工作。

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

我最喜欢这个答案,因为它是对于那些想要在 unlink 完成后运行某些操作且不关心自定义错误消息的人来说,最简单、完整和正确的答案。 - Colin Keenan
为什么要使用__dirname?我想知道是否可以使用相对路径而不是完整路径? - The Bumpaster
我正在使用Node / Express / Multer来通过REST POST调用启用文件附件。如何在Node / Express框架中公开fs.unlink,以便它可以处理REST DELETE调用?帖子是通过app.post(...)公开的,因此是否需要类似的东西来公开删除请求?对于DELETES可能不需要Multer,但让我困惑的是如何公开可行的DELETE。 - Jay J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接