Node.js将子目录的内容移动到当前目录

我有一个Node脚本,将zip下载到tmp/archive.zip并将其解tmp/archivetmp/archive

我想将tmp/archive的内容移入. 。 我很难find如何使用相当于mv tmp/archive/* .的方式使用fs.rename mv tmp/archive/* .

我已经试过fs.rename('tmp/archive/*', '.', function(err){但是这给了我以下错误: Error: ENOENT: no such file or directory, rename 'tmp/archive/*' -> '.'

我也尝试使用glob列出tmp/archive的内容,然后遍历它并使用fs-extra的移动来移动文件,如下所示:

 glob('tmp/archive/*', {}, function(err, files){ for (var i = files.length - 1; i >= 0; i--) { fs.move(files[i], '.', function(err){}); } }.bind(this)); 

导致出现以下错误: Error: EEXIST: file already exists, link 'tmp/archive/subdirectory' -> '.'

我可以调用mv tmp/archive/* . 从脚本,但我想避免,如果可能的话。 有什么明显的我失踪? 我怎么能这样做?

将文件目录从一个位置移动到另一个位置(假设它们位于同一个卷上,因此可以重命名而不是复制):

 var Promise = require('bluebird'); var fs = Promise.promisifyAll(require('fs')); var path = require('path'); function moveFiles(srcDir, destDir) { return fs.readdirAsync(srcDir).map(function(file) { var destFile = path.join(destDir, file); console.log(destFile); return fs.renameAsync(path.join(srcDir, file), destFile).then(function() { return destFile; }); }); } // sample usage: moveFiles(path.join(".", "tempSource"), path.join(".", "tempDest")).then(function(files) { // all done here }).catch(function(err) { // error here }); 

这会将srcDir中的文件和子目录都移动到destDir 。 由于fs.rename()会一次移动一个子目录,因此不必recursion地遍历。

在devise这样的function时,您可以select错误行为。 上面的实现在第一个错误中中止。 你可以改变实现来移动所有可能的文件,然后返回一个无法移动的文件列表。


这是一个版本,它可以重命名所有文件,如果有任何错误,它会在最后拒绝失败的文件列表和它们的错误对象:

 function moveFilesAll(srcDir, destDir) { return fs.readdirAsync(srcDir).map(function(file) { var destFile = path.join(destDir, file); var srcFile = path.join(srcDir, file); return fs.renameAsync(srcFile, destFile).then(function() { return {file: srcFile, err: 0}; }).catch(function(err) { console.log("error on " + srcFile); return {file: srcFile, err: err} }); }).then(function(files) { var errors = files.filter(function(item) { return item.err !== 0; }); if (errors.length > 0) { // reject with a list of error files and their corresponding errors throw errors; } // for success, return list of all files moved return files.filter(function(item) { return item.file; }); }); } // sample usage: moveFilesAll(path.join(".", "tempSource"), path.join(".", "tempDest")).then(function(files) { // all done here }).catch(function(errors) { // list of errors here });