Wie verschiebe ich Dateien in node.js?

151

Wie kann ich Dateien (wie die mv-Befehlsshell) auf node.js verschieben? Gibt es dafür eine Methode oder sollte ich eine Datei lesen, in eine neue Datei schreiben und ältere Dateien entfernen?

Rizidoro
quelle

Antworten:

157

Laut seppo0010-Kommentar habe ich dazu die Umbenennungsfunktion verwendet.

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

fs.rename (oldPath, newPath, Rückruf)

Hinzugefügt in: v0.0.2

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

Asynchrone Umbenennung (2). Für den Abschlussrückruf werden keine anderen Argumente als eine mögliche Ausnahme angegeben.

Rizidoro
quelle
5
Für diejenigen, die sich fragen, wohin der Kommentar von @ seppo0010 ging: Es war meine Antwort, die ich gelöscht und als Kommentar zum OP gepostet habe.
Matt Ball
6
Dies funktioniert nicht, wenn Sie Partitionen kreuzen oder ein virtuelles Dateisystem verwenden, das das Verschieben von Dateien nicht unterstützt. Verwenden Sie diese Lösung besser mit einem Copy-Fallback
Flavien Volken
Die 3. Antwort von "Hani" hat Beispielcode!
Nathan
47

Dieses Beispiel stammt aus: Node.js in Aktion

Eine move () - Funktion, die nach Möglichkeit umbenennt oder auf das Kopieren zurückgreift

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);
    }
}
Teoman Shipahi
quelle
3
Lief wie am Schnürchen. Vielen Dank! Wenn ich ein wenig hinzufügen darf: 'move' ist möglicherweise ein besserer Name, wenn es die Verknüpfung von oldPath aufhebt.
Jokester
Die copy () - Funktion ist in diesem Fall in Ordnung. Wenn jedoch jemand beabsichtigt, sie in ein Promise-Objekt einzuschließen, lesen Sie entweder meine "Antwort" unten oder denken Sie daran, das Versprechen beim "close" -Ereignis im Schreibstrom aufzulösen. nicht im Lesestream.
Jem
Dies sieht nach etwas aus, das für meine Anforderungen geeignet ist, ich weiß jedoch nicht, wie ich den Stil module.exports = function {} verwenden soll. kopiere ich diesen Code in meine App selbst, wo ich bereits var fs = require ('fs') habe; und dann fs.move (oldFile, newFile, function (err) {....}) anstelle von fs.rename aufrufen?
Curious101
@ Curious101 Sie können dies in eine Datei wie filemove.js einfügen und wie var filemove = require ('filemove') importieren. dann benutze es wie filemove (...);
Teoman Shipahi
Danke @Teomanshipahi. In diesem Fall kann ich mylibrary.js hinzufügen und von dort aus verwenden. Ich dachte, dies sei eine bekannte Methode zum Hinzufügen von Prototypmethoden, damit sie im Objekt selbst verfügbar wird.
Curious101
34

Nodejs nativ verwenden

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!')
})

(HINWEIS: "Dies funktioniert nicht, wenn Sie Partitionen kreuzen oder ein virtuelles Dateisystem verwenden, das das Verschieben von Dateien nicht unterstützt. [...]" - Flavien Volken 2. September 15 um 12:50 ")

Hani
quelle
30

Verwenden Sie das MV- Knotenmodul, das zuerst versucht, ein fs.renameKopieren durchzuführen und dann die Verknüpfung aufzuheben.

andrewrk
quelle
Funktionierte gut für die einfachen Anforderungen zum Verschieben einer Datei.
Arcseldon
1
andrewrk scheint der Autor dieses mvKnotenmoduls zu sein. Ich verwende gerne npm zur Installation. npm install mv --save-dev;; Hier ist der npm Link
The Red Pea
3
Wie ist das eine Entwicklungsabhängigkeit? Benötigt die App nicht mv, um zu funktionieren?
jgr0
17

util.pump ist in Knoten 0.10 veraltet und generiert eine Warnmeldung

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

Die Lösung zum Kopieren von Dateien mithilfe von Streams lautet also:

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 */ });
Deadrunk
quelle
2
Dies ist der richtige Weg, um eine Datei zu kopieren / verschieben, die sich auf zwei verschiedenen Partitionen befindet. Danke dir!
Slickplaid
9

Verwenden der Umbenennungsfunktion:

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

wo

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

Angenommen, Sie möchten den Dateinamen unverändert lassen.

iulia
quelle
4
Seien Sie vorsichtig, dies funktioniert nicht, wenn Sie versuchen, die Datei zwischen verschiedenen Partitionen umzubenennen, auch nicht auf einigen virtuellen Dateisystemen (wie zum Beispiel Docker)
Flavien Volken
8

Das fs-extraModul ermöglicht es Ihnen, dies mit seiner move()Methode zu tun . Ich habe es bereits implementiert und es funktioniert gut, wenn Sie eine Datei vollständig von einem Verzeichnis in ein anderes verschieben möchten - dh. Entfernen der Datei aus dem Quellverzeichnis. Sollte für die meisten grundlegenden Fälle funktionieren.

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!")
})
Mikeym
quelle
5

Hier ist ein Beispiel mit util.pump von >> Wie verschiebe ich Datei a auf eine andere Partition oder ein anderes Gerät 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');
});
Alessioalex
quelle
20
Es ist erwähnenswert, dass Sie dies nur tun müssen, wenn Sie Dateien über Volumes verschieben. Andernfalls können Sie einfach verwenden fs.rename()(innerhalb eines Volumes ist das Umbenennen und Verschieben einer Datei dasselbe).
s4y
4
util.pump ist veraltet.
Andrewrk
Ist es möglich, Dateien vom lokalen Computer auf den Server zu verschieben?
Hulk1991
Nein, Sie müssen dafür etwas anderes verwenden (z. B. FTP, HTTP oder ein anderes Protokoll).
Alessioalex
4

Verwenden von Versprechungen für Knotenversionen größer als 8.0.0:

const {promisify} = require('util');
const fs = require('fs');
const {join} = require('path');
const mv = promisify(fs.rename);

const moveThem = async () => {
  // Move file ./bar/foo.js to ./baz/qux.js
  const original = join(__dirname, 'bar/foo.js');
  const target = join(__dirname, 'baz/qux.js'); 
  await mv(original, target);
}

moveThem();
vorillaz
quelle
3
Nur ein Wort der Vorsicht fs.renamefunktioniert nicht, wenn Sie sich in einer Docker-Umgebung mit Volumes befinden.
Atul Yadav
Fügen Sie asyncder moveThemFunktion eine Deklaration hinzu .
H_I
3

Nur meine 2 Cent, wie in der obigen Antwort angegeben : Die copy () -Methode sollte nicht unverändert zum Kopieren von Dateien ohne geringfügige Anpassung verwendet werden:

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

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

    // Do not callback() upon "close" event on the readStream
    // readStream.on('close', function () {
    // Do instead upon "close" on the writeStream
    writeStream.on('close', function () {
        callback();
    });

    readStream.pipe(writeStream);
}

Die Kopierfunktion in einem Versprechen:

function copy(oldPath, newPath) {
  return new Promise((resolve, reject) => {
    const readStream = fs.createReadStream(oldPath);
    const writeStream = fs.createWriteStream(newPath);

    readStream.on('error', err => reject(err));
    writeStream.on('error', err => reject(err));

    writeStream.on('close', function() {
      resolve();
    });

    readStream.pipe(writeStream);
  })

Beachten Sie jedoch, dass das Dateisystem möglicherweise abstürzt, wenn der Zielordner nicht vorhanden ist.

Jem
quelle
3

Ich würde alle beteiligten Funktionen trennen (dh rename, copy, unlink) voneinander Flexibilität und promisify alles zu gewinnen, natürlich:

const renameFile = (path, newPath) => 
  new Promise((res, rej) => {
    fs.rename(path, newPath, (err, data) =>
      err
        ? rej(err)
        : res(data));
  });

const copyFile = (path, newPath, flags) =>
  new Promise((res, rej) => {
    const readStream = fs.createReadStream(path),
      writeStream = fs.createWriteStream(newPath, {flags});

    readStream.on("error", rej);
    writeStream.on("error", rej);
    writeStream.on("finish", res);
    readStream.pipe(writeStream);
  });

const unlinkFile = path => 
  new Promise((res, rej) => {
    fs.unlink(path, (err, data) =>
      err
        ? rej(err)
        : res(data));
  });

const moveFile = (path, newPath, flags) =>
  renameFile(path, newPath)
    .catch(e => {
      if (e.code !== "EXDEV")
        throw new e;

      else
        return copyFile(path, newPath, flags)
          .then(() => unlinkFile(path));
    });

moveFile ist nur eine Komfortfunktion, und wir können die Funktionen separat anwenden, wenn wir beispielsweise eine feinkörnigere Ausnahmebehandlung benötigen.


quelle
2

Shelljs ist eine sehr praktische Lösung.

Befehl: mv ([Optionen,] Quelle, Ziel)

Verfügbare Optionen:

-f: force (Standardverhalten)

-n: um ein Überschreiben zu verhindern

const shell = require('shelljs');
const status = shell.mv('README.md', '/home/my-dir');
if(status.stderr)  console.log(status.stderr);
else console.log('File moved!');
Prayag k
quelle
1

Dies ist eine Wiederholung der Antwort von Teoman Shipahi mit einem etwas weniger mehrdeutigen Namen und folgt dem Entwurfsprinzip, Code zu definieren, bevor Sie versuchen, ihn aufzurufen. (Während der Knoten es Ihnen erlaubt, etwas anderes zu tun, ist es keine gute Praxis, den Wagen vor das Pferd zu stellen.)

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();
        }
    );
}
nicht synchronisiert
quelle
0

Mithilfe der folgenden URL können Sie Ihre Datei CURRENT Source entweder kopieren oder in die Zielquelle verschieben

https://coursesweb.net/nodejs/move-copy-file

/*********Moves the $file to $dir2 Start *********/
var moveFile = (file, dir2)=>{
  //include the fs, path modules
  var fs = require('fs');
  var path = require('path');

  //gets file name and adds it to dir2
  var f = path.basename(file);
  var dest = path.resolve(dir2, f);

  fs.rename(file, dest, (err)=>{
    if(err) throw err;
    else console.log('Successfully moved');
  });
};

//move file1.htm from 'test/' to 'test/dir_1/'
moveFile('./test/file1.htm', './test/dir_1/');
/*********Moves the $file to $dir2 END *********/

/*********copy the $file to $dir2 Start *********/
var copyFile = (file, dir2)=>{
  //include the fs, path modules
  var fs = require('fs');
  var path = require('path');

  //gets file name and adds it to dir2
  var f = path.basename(file);
  var source = fs.createReadStream(file);
  var dest = fs.createWriteStream(path.resolve(dir2, f));

  source.pipe(dest);
  source.on('end', function() { console.log('Succesfully copied'); });
  source.on('error', function(err) { console.log(err); });
};

//example, copy file1.htm from 'test/dir_1/' to 'test/'
copyFile('./test/dir_1/file1.htm', './test/');
/*********copy the $file to $dir2 END *********/

Abdullah Pariyani
quelle
-1

Wenn Sie versuchen, eine Quelldatei von node.js zu verschieben oder umzubenennen, versuchen Sie dies https://github.com/viruschidai/node-mv . Die Verweise auf diese Datei werden in allen anderen Dateien aktualisiert.

Wilhelm
quelle
-6

Du kannst den ... benutzen move-file npm-Paket verwenden:

Installieren Sie zuerst das Paket:

$ npm install move-file

Verwendung:

const moveFile = require('move-file');

// moveFile Returns a Promise that resolves when the file has been moved
moveFile('source/unicorn.png', 'destination/unicorn.png')
  .then(() => {/* Handle success */})
  .catch((err) => {/* Handle failure */});

// Or use async/await
(async () => {
    try {
      await moveFile('source/unicorn.png', 'destination/unicorn.png');
      console.log('The file has been moved');
    } catch (err) {
      // Handle failure
      console.error(err);
    }
})();
Paridhi shah
quelle
Kurze und kluge Antwort, Good @paridhishah
Abdullah Pariyani
2
Dies ist ein Aufruf einer Funktion, die noch nicht erstellt wurde, und lediglich einen Fehler auslöst.
Steve Carey