2011-12-20 15 views

Odpowiedz

86

Według seppo0010 komentarzu użyłem funkcji Zmień nazwę, aby to zrobić.

http://nodejs.org/docs/latest/api/fs.html#fs_fs_rename_oldpath_newpath_callback

fs.rename (oldpath, newpath, zwrotna)

dodane w: v0.0.2

oldPath <String> | <Buffer> 
newPath <String> | <Buffer> 
callback <Function> 

asynchroniczny zmiany nazwy (2). Żadne argumenty inne niż możliwy wyjątek są podawane do wywołania zwrotnego zakończenia.

+4

Dla tych, którzy zastanawiają się, gdzie trafił komentarz @ seppo0010: to była moja odpowiedź, którą skreśliłem i opublikowałem jako komentarz do OP. –

+4

Nie będzie działać, jeśli przechodzisz przez partycje lub używasz wirtualnego systemu plików, który nie obsługuje przenoszenia plików. Lepiej użyj [tego rozwiązania] (http://stackoverflow.com/a/29105404/532695) z wersją zastępczą –

5

Oto przykład przy użyciu util.pump z >>How do I move file a to a different partition or device in Node.js?

var fs = require('fs'), 
    util = require('util'); 

var is = fs.createReadStream('source_file') 
var os = fs.createWriteStream('destination_file'); 

util.pump(is, os, function() { 
    fs.unlinkSync('source_file'); 
}); 
+17

Warto zauważyć, że trzeba to zrobić tylko podczas przenoszenia plików w woluminach. W przeciwnym razie możesz po prostu użyć ['fs.rename()'] (http://nodejs.org/docs/latest/api/fs.html#fs.rename) (w woluminie zmieniającym nazwę pliku i przenoszeniu go jest to ta sama rzecz). – s4y

+3

util.pump jest przestarzałe. – andrewrk

+0

http://stackoverflow.com/questions/4568689/how-do-i-move-file-a-to-a-different-partition-in-node-js#comment17237127_4571377 –

19

Użyj modułu węzła mv, który najpierw spróbuje wykonać fs.rename, a następnie powrócić do kopiowania, a następnie odłączenia.

+0

Dobrze działające dla prostych wymagań, aby przenieść plik. – arcseldon

+0

andrewrk wydaje się być autorem tego modułu węzła 'mv'. Lubię używać npm do instalacji; 'npm install mv --save-dev'; Oto link [npm link] (https://www.npmjs.com/package/mv) –

14

util.pump jest przestarzałe w węźle 0,10 i generuje komunikat ostrzegawczy

util.pump() is deprecated. Use readableStream.pipe() instead 

więc rozwiązanie do kopiowania plików za pomocą strumieni jest:

var source = fs.createReadStream('/path/to/source'); 
var dest = fs.createWriteStream('/path/to/dest'); 

source.pipe(dest); 
source.on('end', function() { /* copied */ }); 
source.on('error', function(err) { /* error */ }); 
+2

To jest właściwy sposób kopiowania/przenoszenia pliku znajdującego się na dwóch różnych partycjach. Dziękuję Ci! – slickplaid

24

Ten przykład wywodzą się z: Node.js in Action

posunięcie() funkcji, która zmienia nazwy, jeżeli to możliwe, lub wraca do kopiowania

var fs = require('fs'); 

module.exports = function move(oldPath, newPath, callback) { 

    fs.rename(oldPath, newPath, function (err) { 
     if (err) { 
      if (err.code === 'EXDEV') { 
       copy(); 
      } else { 
       callback(err); 
      } 
      return; 
     } 
     callback(); 
    }); 

    function copy() { 
     var readStream = fs.createReadStream(oldPath); 
     var writeStream = fs.createWriteStream(newPath); 

     readStream.on('error', callback); 
     writeStream.on('error', callback); 

     readStream.on('close', function() { 
      fs.unlink(oldPath, callback); 
     }); 

     readStream.pipe(writeStream); 
    } 
} 
+0

Pracował jak urok. Dzięki! Jeśli mogę dodać trochę: "move" może być lepszą nazwą, gdy odłączy oldPath. – Jokester

8

pomocą funkcji zmiany nazwy:

fs.rename(getFileName, __dirname + '/new_folder/' + getFileName); 

gdzie

getFilename = file.extension (old path) 
__dirname + '/new_folder/' + getFileName 

Założenie, że chcesz zachować niezmienioną nazwę pliku.

+3

Należy pamiętać, że to nie zadziała, jeśli spróbujesz zmienić nazwę pliku między różnymi partycjami, ani w niektórych wirtualnych systemach plików (na przykład w dokowaniu) –

4

Moduł fs-extra umożliwia to za pomocą metody move(). Już go zaimplementowałem i działa dobrze, jeśli chcesz całkowicie przenieść plik z jednego katalogu do drugiego - np. usunięcie pliku z katalogu źródłowego. Powinien działać w większości podstawowych przypadków.

var fs = require('fs-extra') 

fs.move('/tmp/somefile', '/tmp/does/not/exist/yet/somefile', function (err) { 
if (err) return console.error(err) 
console.log("success!") 
}) 
0

to mikstura z teoman shipahi's answer z nieco mniej dwuznaczną nazwą, a po stosowania zasady projektowania definiowania kodu przed próbą to nazwać. (Podczas gdy węzeł pozwala robić inaczej, nie jest dobrą praktyką włożenie wózka przed konia.)

function rename_or_copy_and_delete (oldPath, newPath, callback) { 

    function copy_and_delete() { 
     var readStream = fs.createReadStream(oldPath); 
     var writeStream = fs.createWriteStream(newPath); 

     readStream.on('error', callback); 
     writeStream.on('error', callback); 
     readStream.on('close', 
       function() { 
       fs.unlink(oldPath, callback); 
       } 
     ); 

     readStream.pipe(writeStream); 
    } 

    fs.rename(oldPath, newPath, 
     function (err) { 
      if (err) { 
       if (err.code === 'EXDEV') { 
        copy_and_delete(); 
       } else { 
        callback(err); 
       } 
       return;// << both cases (err/copy_and_delete) 
      } 
      callback(); 
     } 
    ); 
} 
4

Korzystanie nodejs natywnie

var fs = require('fs') 

var oldPath = 'old/path/file.txt' 
var newPath = 'new/path/file.txt' 

fs.rename(oldPath, newPath, function (err) { 
    if (err) throw err 
    console.log('Successfully renamed - AKA moved!') 
})