【问题标题】:node.js remove filenode.js 删除文件
【发布时间】:2011-07-15 23:13:32
【问题描述】:

如何使用 node.js 删除文件?

http://nodejs.org/api/fs.html#fs_fs_rename_oldpath_newpath_callback

我没有看到删除命令?

【问题讨论】:

    标签: node.js


    【解决方案1】:

    我想你想使用fs.unlink

    更多关于fs的信息可以在here找到。

    【讨论】:

    • 我相信它来自 POSIX 标准。但你会认为他们可以添加一个delete 别名!
    • @Nick 或 rmFile 别名
    • @PixnBits 或 rm 别名(如果他们有 rmdir 方法)
    • 对于 Meteor 用户,您可能需要使用fs.unlinkSync()
    • 我认为你应该提供一个完整的例子,链接可以改变。
    【解决方案2】:

    您可以调用fs.unlink(path, callback) 进行异步取消链接(2) 或调用fs.unlinkSync(path) 进行同步取消链接(2)。
    其中path 是您要删除的文件路径。

    例如,我们想从c:/book 目录中删除discovery.docx 文件。所以我的文件路径是c:/book/discovery.docx。所以删除该文件的代码将是,

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

    【讨论】:

      【解决方案3】:

      如果您想在删除之前检查文件是否存在。因此,请使用 fs.statfs.statSync (同步) 而不是 fs.exists。因为根据最新的node.js documentationfs.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');
         });  
      });
      

      【讨论】:

      • 如果我检查它是否存在,但它被另一个进程阻止 - 或者,我检查它存在,这很好,但是另一个进程在我能够删除之前随机阻止它。检查后如何立即阻止?那么我不会因为它被阻止而无法删除
      • 请注意 fs.exists() 已弃用,但 fs.existsSync() 不是。
      • 不推荐使用它是有原因的:如果您在删除文件之前检查文件是否存在,通常会创建竞争条件。相反,您应该只调用fs.unlink,如果该文件不存在,您将在回调中出现ENOENT 错误。在尝试取消链接之前无需检查。
      • @ZachB 为什么删除操作fs.unlink 在文件不存在时执行,所以我的观点是在删除之前检查文件。
      • 如果有多个线程或进程可能正在使用或试图删除同一个文件,则不应检查它是否存在,在这种情况下,您对该文件存在的检查将在这段时间内无效您检查它是否存在以及您尝试删除它的时间。只需检查 unlink 回调中的 ENOENT 错误代码。如果发生该错误,则该文件不存在。以 Searene 的回答为例。
      【解决方案4】:

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

      【讨论】:

      • 如何在我们的控制器中获取之前的图像名称?
      【解决方案5】:

      这是我为此目的制作的一个小sn-p,

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

      【讨论】:

      • 如果文件在您与fs.exists 核对并在您与fs.unlink 删除之前被其他人删除怎么办?它可能会发生。
      • 在尝试取消链接之前,您不应检查文件是否存在。只需调用unlink,如果它不存在,则处理ENOENT 错误。否则,您可以创建竞争条件。
      【解决方案6】:

      2019 和 Node 10+ 在这里。下面的版本使用甜蜜的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);
        }
      })();
      

      Here isfsPromises.unlink 来自 Node 文档的规范。

      另外请注意,fs.promises API 在 Node 10.x.x 中被标记为实验性(但工作完全正常),并且自 11.14.0 以来不再是实验性的。

      【讨论】:

        【解决方案7】:

        作为接受的答案,使用fs.unlink 删除文件。

        但是根据Node.js documentation

        不建议在调用fs.open()fs.readFile()fs.writeFile() 之前使用fs.stat() 检查文件是否存在。相反,用户代码应该直接打开/读取/写入文件并处理文件不可用时引发的错误。

        要检查文件是否存在而不进行后续操作,建议使用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 是没有意义的。
        • 这不是对所提出问题的回答,该问题专门关于如何删除文件。 (相反,如何知道您是否有权删除它。)
        【解决方案8】:

        2020 年答案

        随着节点 v14.14.0 的发布,您现在可以这样做了。

        fs.rmSync("path/to/file", {
            force: true,
        });
        

        https://nodejs.org/api/fs.html#fsrmsyncpath-options

        【讨论】:

          【解决方案9】:

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

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

          【讨论】:

          • 我最喜欢这个答案,因为对于那些想知道在取消链接完成后如何运行某些东西并且不关心自定义错误消息的人来说,它是最简单完整和正确的答案。
          • 你为什么使用__dirname?我想知道我们是否可以放置相对路径而不是完整路径?
          • 我正在使用 Node / Express / Multer 通过 REST POST 调用启用文件附件。如何在 Node / Express 框架中公开 fs.unlink 以便它可以处理 REST DELETE 调用?帖子通过 app.post(...) 公开,那么公开删除请求是否需要类似的东西? DELETES 可能不需要 Multer,但让我陷入困境的是如何公开可行的 DELETE。
          【解决方案10】:

          简单和同步

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

          【讨论】:

            【解决方案11】:

            你可以做以下事情

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

            【讨论】:

              【解决方案12】:
              • fs.unlinkSync() 如果你想同步删除文件并且
              • fs.unlink() 如果你想异步删除它。

              Here你可以找到一篇好文章。

              【讨论】:

                【解决方案13】:

                rm -rf

                require("fs").rmSync(file_or_directory_path_existing_or_not, {recursive: true, force: true});
                // Added in Node.js 14.14.0.
                

                使用require("fs").rmSyncrequire("fs").rm

                【讨论】:

                  【解决方案14】:

                  您可以使用del 模块删除当前目录中的一个或多个文件。它的好处是可以防止您删除当前工作目录及更高版本。

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

                  【讨论】:

                  • 如果您需要删除多个文件,这是一个不错的选择!谢谢你的建议。
                  【解决方案15】:

                  您可以使用fs.unlink(path, callback) 函数。下面是一个带有“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');
                      }
                    })
                  };

                  【讨论】:

                    【解决方案16】:

                    从与文件名的正则表达式匹配的目录中删除文件。仅使用 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]) 
                            }
                        }
                    });
                    

                    【讨论】:

                      【解决方案17】:

                      使用 fs 很容易。

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

                      【讨论】:

                        【解决方案18】:

                        fs-extra提供remove方法:

                        const fs = require('fs-extra')
                        
                        fs.remove('/tmp/myfile')
                        .then(() => {
                          console.log('success!')
                        })
                        .catch(err => {
                          console.error(err)
                        })
                        

                        https://github.com/jprichardson/node-fs-extra/blob/master/docs/remove.md

                        【讨论】:

                          【解决方案19】:

                          使用NPM module fs-extra,它可以为您提供 fs 中的所有内容,而且所有内容都是 Promisified。作为奖励,有一个 fs.remove() method 可用。

                          【讨论】:

                            【解决方案20】:

                            这里是您可以从文件夹中删除文件/图像的代码。

                            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 开始,回调参数不再是可选的,并且会导致警告。如果您真的不在乎,请传递一个空函数。
                            猜你喜欢
                            • 1970-01-01
                            • 2014-01-14
                            • 1970-01-01
                            • 2022-12-12
                            • 2019-09-10
                            • 2012-12-27
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多