Как мне переместить файлы в node.js?

Как я могу переместить файлы (например, командную оболочку mv) на node.js? Есть ли способ для этого или я должен прочитать файл, записать в новый файл и удалить старый файл?

Ответ 1

Согласно комментарию seppo0010, я использовал функцию переименования для этого.

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

fs.rename(oldPath, newPath, обратный вызов)

Добавлено в: v0.0.2

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

Асинхронное переименование (2). Нет аргументов, кроме возможного исключения передаются на обратный вызов завершения.

Ответ 2

В этом примере взято из Node.js в действии

Функция move(), которая переименовывает, если это возможно, или возвращается к копированию

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

Ответ 3

Используйте модуль mv node, который сначала попытается выполнить fs.rename, а затем вернуться к копированию и затем отключить.

Ответ 4

Использование nodejs изначально

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

(ПРИМЕЧАНИЕ: "Это не будет работать, если вы пересекаете разделы или используете виртуальную файловую систему, не поддерживающую перемещение файлов. [...]" - Flavien Volken Sep 2 '15 at 12:50 ")

Ответ 5

util.pump устарел в node 0,10 и генерирует предупреждающее сообщение

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

Итак, решение для копирования файлов с использованием потоков:

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

Ответ 6

Использование функции переименования:

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

где

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

что вы хотите сохранить имя файла без изменений.

Ответ 7

Модуль fs-extra позволяет вам сделать это с помощью метода move(). Я уже реализовал его, и он хорошо работает, если вы хотите полностью перенести файл из одного каталога в другой, то есть. удаление файла из исходного каталога. Должен работать для большинства основных случаев.

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

Ответ 9

Использование обещаний для версий Node более 8.0.0:

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

const moveThem = () => {
  // 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();

Ответ 10

Только мои 2 цента, как указано в ответе выше: метод copy() не должен использоваться как есть для копирования файлов без небольшой корректировки:

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

Функция копирования, обернутая в Обещание:

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

Однако имейте в виду, что файловая система может произойти сбой, если целевая папка не существует.

Ответ 11

Я бы отделил все задействованные функции (то есть rename, copy, unlink) друг от друга, чтобы получить гибкость и обещать все, конечно:

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 - это просто moveFile функция, и мы можем применять функции отдельно, когда, например, нам нужна более точная обработка исключений.

Ответ 12

это пересмотр teoman shipahi answer с чуть менее двусмысленным именем и следуя указателю дизайна определения кода, прежде чем пытаться его вызвать. (В то время как node позволяет вам сделать иначе, это не очень хорошая практика, чтобы поставить телегу перед лошадью.)

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

Ответ 13

Переместите file1.htm из "test/" в "test/dir_1/"

moveFile('./test/file1.htm', './test/dir_1/');

Ответ 14

С помощью приведенного ниже URL, вы можете скопировать или переместить файл CURRENT Source в Destination Source.

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 *********/

Ответ 15

Если вы пытаетесь переместить или переименовать исходный файл node.js, попробуйте https://github.com/viruschidai/node-mv. Он обновит ссылки на этот файл во всех других файлах.