2016-07-06 166 views
1

我有一个节点脚本,它将zip压缩文件下载到tmp/archive.zip中,并将其压缩到tmp/archiveNode.js将子目录的内容移动到当前目录

我想将tmp/archive的内容转换为.。我很难找到怎样的方式,相当于mv tmp/archive/* .

我曾尝试fs.rename('tmp/archive/*', '.', function(err){使用fs.rename但给了我以下错误:Error: ENOENT: no such file or directory, rename 'tmp/archive/*' -> '.'

我也用glob列出的内容尝试tmp/archive,然后遍历它和移动使用FS-额外的举动的文件,如下所示:

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/* .,但如果可能的话,我想避免这种情况。有什么明显的我失踪?我怎么能这样做呢?

+0

请问源子目录包含子目录本身或只是文件? – jfriend00

+0

我试图移动的子目录包含两个文件夹(也包含文件夹等)和文件。 – rabble

+0

好的,我的答案在下面支持嵌套的子目录。它也会移动。我已经自己测试过了。 – jfriend00

回答

1

下面是从一个位置移动文件的目录中,另外一个方法(假设他们是相同的卷上,因此可以被重命名,而不是复制):

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

这将移动这两个文件和子文件在srcDirdestDir的目录。由于fs.rename()将一次移动一个子目录,所以不必递归地遍历。

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


下面是一个重命名的所有文件,它可以,如果有任何错误,它拒绝在与失败的文件及其错误的对象列表末尾的一个版本:

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 
}); 
+0

@rabble - 这对你有用吗? – jfriend00

+0

嗨,谢谢你的回答!我还没有机会尝试它,但我会尽快尝试并让你知道。 – rabble

相关问题