2016-07-06 4 views
1

Ich habe ein Node-Skript, das eine Zip in tmp/archive.zip herunterlädt und das zu tmp/archive extrahiert. Ich möchte den Inhalt von tmp/archive in . verschieben. Ich habe Schwierigkeiten zu finden, wie fs.rename in einer Art und Weise zu verwenden, die zu mv tmp/archive/* . entsprichtNode.js Inhalt des Unterverzeichnisses in aktuelles Verzeichnis verschieben

ich fs.rename('tmp/archive/*', '.', function(err){ versucht, aber das gibt mir die folgende Fehlermeldung: Error: ENOENT: no such file or directory, rename 'tmp/archive/*' -> '.'

ich auch versucht haben, glob unter Verwendung der Inhalte zur Liste der tmp/archive und dann durchlaufen und bewegen sie die Dateien fs-extra Umzug wie folgt verwendet:

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

die im folowing Fehler führt: Error: EEXIST: file already exists, link 'tmp/archive/subdirectory' -> '.'

Ich könnte einfach mv tmp/archive/* . aus dem Skript aufrufen, aber ich möchte das möglichst vermeiden. Gibt es etwas Offensichtliches, das mir fehlt? Wie kann ich das tun?

+0

Ist die Source-Unterverzeichnis enthalten Unterverzeichnisse selbst oder nur Dateien? – jfriend00

+0

Das Unterverzeichnis, das ich verschieben möchte, enthält sowohl Ordner (die auch Ordner usw. enthalten) als auch Dateien. – rabble

+0

OK, meine Antwort unten unterstützt verschachtelte Unterverzeichnisse. Es wird sich dann auch bewegen. Ich habe es selbst getestet. – jfriend00

Antwort

1

Hier ist eine Möglichkeit, ein Verzeichnis von Dateien von einem Ort zum anderen zu bewegen (vorausgesetzt, sie auf das gleiche Volumen und somit können umbenannt werden und nicht kopiert):

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

Dies wird sowohl Dateien als auch Unter bewegen -Directories in srcDir zu destDir. Da fs.rename() ein Unterverzeichnis auf einmal verschieben wird, müssen Sie nicht rekursiv durchlaufen.

Beim Entwerfen einer Funktion wie dieser haben Sie die Wahl des Fehlerverhaltens. Die obige Implementierung bricht nach dem ersten Fehler ab. Sie können die Implementierung ändern, um alle Dateien zu verschieben und dann eine Liste von Dateien zurückgeben, die nicht verschoben werden konnten.


Hier ist eine Version, die alle Dateien, die es umbenennt und wenn es irgendwelche Fehler aufgetreten sind, es mit einer Liste der Dateien am Ende ablehnt, die und deren Fehlerobjekte fehlgeschlagen:

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 - Würde das für Sie arbeiten? – jfriend00

+0

Hallo, danke für deine Antwort! Ich hatte noch keine Gelegenheit, es auszuprobieren, aber ich werde es so schnell wie möglich versuchen und Sie wissen lassen. – rabble

Verwandte Themen