2016-07-06 102 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

相關問題