节点:尝试重命名目录中的每个文件跳过一些

我试图通过一个目录(及其所有的子目录),并重命名(移动)每个图像,如果它是一个.jpg文件。 我认为我的代码是正确的。 我正在使用asynchronous重命名和递增计数器来增加文件名。 由于某些原因,在我的四个左右子文件夹的testing中,只有一半的图像被重命名。 我不知道这是为什么,因为我只是在callback文件(一旦图像已经成功重命名)和检查控制台列出rename被调用的每个文件时递增。

 var fs = require('fs'); var filePrefix = 'new_Images'; var folderName = 'changed'; var counter = 0; function examine (path) { fs.readdir(path, function (err, files) { files.forEach(function (file) { var oldPath = path + file; fs.stat(oldPath, function (err, stats) { if (stats.isDirectory()) { examine(oldPath + '/'); } else { var suffix = oldPath.substr(oldPath.length - 3); if (suffix === 'jpg') { fs.rename(oldPath, './' + folderName + '/' + filePrefix + counter + '.jpg', function (e) { if (e) throw new Error('something bad happened'); console.log('Renamed a .jpg file'); console.log(oldPath); console.log(counter); counter++; }); } else if (suffix === 'png') { fs.rename(oldPath, './' + folderName + './' + filePrefix + counter + '.png', function (e) { if (e) throw new Error('something bad happened'); console.log('Renamed a .png file'); console.log(oldPath); console.log(counter); counter++; }); } } }); }); }); } examine('./'); 

这段代码会logging每一个文件被重命名,所有的文件将被删除,但其中只有一半实际移动(重命名)到新的文件夹

       

网上收集的解决方案 "节点:尝试重命名目录中的每个文件跳过一些"

我猜这些文件正在被覆盖。

由于在重命名时进行asynchronous调用,所以在进行asynchronous调用之前应该增加counter ,而不是在成功重命名之后。 由于在asynchronous调用中没有顺序,所以有可能一半的调用在具有相同名称的任何成功的重命名操作之前进行。

您可以通过logging文件名来validation这一点:

 if (suffix === 'jpg') { console.log('renaming with file name ' + filePrefix + counter + '.jpg'); fs.rename(oldPath, './' + folderName + '/' + filePrefix + counter + '.jpg', function (e) { ... }); } else if (suffix === 'png') { console.log('renaming with file name ' + filePrefix + counter + '.png'); fs.rename(oldPath, './' + folderName + './' + filePrefix + counter + '.png', function (e) { ... }); } 

该计划满足所有要求

 var fs = require('fs'), path = require('path'); var oldPath = 'G:\\oldPath\\oldPath'; var newPath = 'G:\\newPath\\newPath\\'; var ext = 'jpg'; var newPrefix = 'newPrefix'; var myFun = function(mypath) { fs.readdir(mypath, function(error, files) { if (error) console.log('error ' + error.code + ' : ' + error.message); else { files.map(function(file) { return path.join(mypath, file) }).filter(function(file) { if(fs.statSync(file).isFile()) return file; else return myFun(file); }).forEach(function(file){ var path_file = file.split('\\'); var extension = path_file[path_file.length - 1].split('.'); if (extension[1] === ext) { var source = fs.createReadStream(file); var target = fs.createWriteStream(newPath + newPrefix + path_file[path_file.length - 1]); source.pipe(target); fs.unlink(file); } }) } }) }