fs.rename的异常行为:文件删除(node.js) [英] Strange behaviour with fs.rename : file deletion (node.js)

查看:324
本文介绍了fs.rename的异常行为:文件删除(node.js)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想编写一个自定义脚本,该脚本将递归地重命名目录中包含文件名的点中的所有文件。像:
mv'foo.bar.avi''foo bar.avi'

I wanted to write a custom script that would rename all of the files in a directory that contains a dot in the filename, recursively. Like : mv 'foo.bar.avi' 'foo bar.avi'

它也将目录名称转换为'abc / xyzmp4'成为'abc / x y.mp4'并删除所有下划线_。

It also converts directories names like 'a.b.c/x.y.z.mp4' becomes 'a b c/x y.mp4' and removes all underscores _.

结果最终删除了该目录中的所有文件,只留下了一些空目录,而没有任何通知或错误,使我肯定丢失了大约300 Gb的未备份数据。

The result ended in deleting all of the files in this directory, leaving only some empty directories, without any notice or error, making me lose definitely around 300 Gb of unbackuped data.

有很棒的代码可以实现这一壮举:

There is the wonderful code that allowed this feat :

var fs = require('fs');
var path = require('path');
var util = require('util');
var fse = require('fs-extra')
var async = require('async');
var walk = function(dir, done) {
  var results = [];
  fs.readdir(dir, function(err, list) {
    if (err) return done(err);
    var pending = list.length;
    if (!pending) return done(null, results);
    list.forEach(function(file) {
      file = path.resolve(dir, file);
      fs.stat(file, function(err, stat) {
        if (stat && stat.isDirectory()) {
          walk(file, function(err, res) {
            results = results.concat(res);
            if (!--pending) done(null, results);
          });
        } else {
          if (file.indexOf('/.') < 0) {
            results.push(file);
          }
          if (!--pending) done(null, results);
        }
      });
    });
  });
};
var rename = function(err, filename) {
    if (util.isArray(filename)) {
      for (var i = 0; i < filename.length; i++) {
        rename(err, filename[i]);
      }
      return;
    }
    fs.stat(filename, function(err, stat) {
      if (!stat.isDirectory()) {
        filename2 = filename.split('.');
        var extension = filename2.pop();
        filename2 = filename2.join(' ').split('_').join(' ') + '.' + extension;
        var directory = filename2.split('/');
        directory.pop();
        directory = directory.join('/');
        async.series([
          function (callback) {
            fse.mkdirs(directory, function (err) {
              callback(err, 'fs.mkdirs');
            });
          },
          function(callback) {
            fs.rename(filename, filename2, function (err) {
              callback(err, 'fs.rename');
            });
          }
        ],
        function (err, results) {
          if (err) {
            console.log(err);
          }
          console.log('All files have been renamed');
        });
      }
    });
}
walk('/Volumes/My Passport/Movies/', function(err, results) {
    rename('', results);
});

做任何事情都为时已晚,我已经为这一损失感到哀悼。

It's too late to do anything, I have already mourning this loss.

我只是想了解这个fs.rename如何删除文件。

I just would like to understand how this fs.rename could delete the files.

我不敢相信自己做到了。我什至没有生气,这太神奇了。我的脚本删除了300gb的数据,甚至没有一条有关删除的指令。我接受了我的信仰。

I can not believe I did it. I am not even mad, it's amazing. My script deleted 300gb of data without even one single instruction about deleting. I accepted my faith.

我怀疑fs.rename在外部驱动器上有问题。

I suspect that fs.rename is buggy on external drives.

谢谢。

推荐答案

所以,这很遗憾,但是问题是您忘记了 var 声明 filename2 时。因此, filename2 成为全局变量。 fs.rename 每次都获得相同的值。解决方案是将filename2声明为 var filename2 或摆脱 async.series

So, that is a pity to say but the problem was that you had forgotten var when declaring filename2. Thus, filename2 became a global variable. fs.rename was getting the same value every time. The solution would be either declare filename2 as var filename2 or get rid of async.series.

这篇关于fs.rename的异常行为:文件删除(node.js)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆