Как мне переместить файлы в node.js? - PullRequest
115 голосов
/ 20 декабря 2011

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

Ответы [ 15 ]

130 голосов
/ 20 декабря 2011

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

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

fs.rename (oldPath, newPath, callback)

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

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

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

38 голосов
/ 17 марта 2015

Этот пример взят из: 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);
    }
}
25 голосов
/ 12 октября 2012

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

17 голосов
/ 08 июля 2013

util.pump устарела в узле 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 */ });
12 голосов
/ 10 января 2017

Собственное использование 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 в 12:50 " )

9 голосов
/ 16 августа 2015

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

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

где

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

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

8 голосов
/ 28 декабря 2015

Модуль 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!")
})
4 голосов
/ 20 декабря 2011

Вот пример использования util.pump из >> Как переместить файл a в другой раздел или устройство в 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');
});
3 голосов
/ 12 декабря 2018

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

2 голосов
/ 12 июля 2019

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

moveFile('./test/file1.htm', './test/dir_1/');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...