node.js에서 파일을 어떻게 이동합니까?


151

node.js에서 mv 명령 쉘과 같은 파일을 어떻게 이동합니까? 그 방법이 있습니까? 아니면 파일을 읽고 새 파일에 쓰고 오래된 파일을 제거해야합니까?

답변:


157

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). 완료 콜백에는 가능한 예외 이외의 인수가 제공되지 않습니다.


5
@ seppo0010의 의견이 어디로 갔는지 궁금해하는 사람들을 위해 : 그것은 내 대답에 있었고, 삭제하고 OP에 대한 의견으로 게시했습니다.
Matt Ball

6
파티션을 건너거나 파일 이동을 지원하지 않는 가상 파일 시스템을 사용하는 경우에는 작동하지 않습니다. 당신은 더 나은 사용 이 솔루션 사본 대체와
의 Flavien Volken

"Hani"의 세 번째 답변에는 예제 코드가 있습니다!
나단

47

이 예제는 Node.js in Action 에서 가져온 것입니다.

가능한 경우 이름을 바꾸거나 복사로 이동하는 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
매력처럼 일했다. 감사! 조금 추가 할 수 있다면 : oldPath와의 연결을 해제 할 때 'move'가 더 나은 이름 일 수 있습니다.
Jokester

이 경우 copy () 함수는 정상이지만, 누군가 Promise 객체로 랩핑하려는 경우 아래의 "답변"을 참조하거나 쓰기 스트림에서 "close"이벤트에 대한 약속을 해결하기 위해 명심하십시오. 읽기 스트림에 없습니다.
Jem

이것은 내 요구에 맞는 것으로 보이지만 module.exports = function {} 스타일을 사용하는 방법을 모르겠습니다. 이 코드를 이미 내 응용 프로그램 자체에 복사합니까? var fs = require ( 'fs'); fs.rename 대신 fs.move (oldFile, newFile, function (err) {....})을 호출하십시오.
Curious101

@ Curious101 이것을 filemove.js와 같은 파일에 넣고 var와 같이 가져올 수 있습니다. var filemove = require ( 'filemove'); 그런 다음 filemove (...)와 같이 사용하십시오.
Teoman shipahi

@Teomanshipahi 감사합니다. 이 경우 mylibrary.js에 추가하여 사용할 수 있습니다. 나는 이것이 프로토 타입 방법을 추가하는 잘 알려진 방법이라고 생각하여 객체 자체에서 사용할 수있게되었다.
Curious101

35

기본적으로 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 9 월 2 일 15시 12 분 50 초 "


30

먼저 mv 노드 모듈을 사용하여 fs.rename복사를 시도한 다음 연결을 끊으십시오.


파일을 이동하기위한 간단한 요구 사항에 적합했습니다.
arcseldon

1
andrewrk가이 mv노드 모듈 의 저자 인 것 같습니다 . 나는 npm을 사용하여 설치하는 것을 좋아한다. npm install mv --save-dev; 여기 npm 링크가 있습니다
The Red Pea

3
이것이 어떻게 dev 의존성입니까? 앱이 작동하기 위해 mv가 필요하지 않습니까?
jgr0

17

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

2
이것은 두 개의 다른 파티션에있는 파일을 복사 / 이동하는 올바른 방법입니다. 감사합니다!
slickplaid

9

이름 바꾸기 기능 사용 :

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

어디

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

파일 이름을 변경하지 않고 유지한다고 가정합니다.


4
당신은 어느 쪽 일부 가상 파일 시스템 (예 : 예를 들어 고정 표시기로) 다른 파티션의 파일의 이름을 변경하려고하면 문제가 해결되지 않습니다주의
의 Flavien Volken

8

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

5

다음은 util.pump를 사용하는 예제입니다. >> Node.js에서 파일 a를 다른 파티션이나 장치로 어떻게 이동합니까?

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

20
볼륨간에 파일을 이동할 때만이 작업을 수행해야합니다. 그렇지 않으면 fs.rename()볼륨을 사용 하여 파일의 이름을 바꾸고 이동하는 것이 동일합니다.
s4y

4
util.pump는 더 이상 사용되지 않습니다.
andrewrk


로컬 컴퓨터에서 서버로 파일을 이동할 수 있습니까?
Hulk1991

아닙니다. FTP, HTTP 또는 다른 프로토콜을 사용하는 등 다른 용도로 사용해야합니다.
alessioalex

4

8.0.0보다 큰 Node 버전에 대한 약속 사용 :

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

3
fs.rename볼륨이있는 Docker 환경에있는 경우 주의 할 사항 이 없습니다.
Atul Yadav

함수에 async선언을 추가하십시오 moveThem.
H_I

3

답변 에서 언급 한대로 내 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);
  })

그러나 대상 폴더가 없으면 파일 시스템이 중단 될 수 있습니다.


3

모든 관련 기능 (예 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

Shelljs 는 매우 편리한 솔루션입니다.

명령 : mv ([옵션,] 소스, 대상)

사용 가능한 옵션 :

-f : 강제 (기본 동작)

-n : 덮어 쓰기 방지

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

1

이것은 약간 덜 모호한 이름을 가진 teoman shipahi의 대답다시 해시 하고 코드를 호출하기 전에 코드를 정의하는 디자인 원칙을 따릅니다 . (노드가 달리 할 수는 있지만 말 앞에 카트를 두는 것은 좋지 않습니다.)

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

0

아래 URL의 도움으로 파일을 복사하거나 대상 소스로 옮길 수 있습니다

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



-6

move-filenpm 패키지를 사용할 수 있습니다 :

먼저 패키지를 설치하십시오 :

$ npm install move-file

용법:

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

짧고 현명한 답변, Good @paridhishah
Abdullah Pariyani

2
그것은 아직 생성되지 않은 함수에 대한 호출이므로 오류를 던질 것입니다.
Steve Carey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.