web-dev-qa-db-ja.com

ファイルaをNode.jsの別のパーティションまたはデバイスに移動するにはどうすればよいですか?

Node.jsスクリプトでファイルをあるパーティションから別のパーティションに移動しようとしています。 fs.renameSyncを使用すると、Error: EXDEV, Cross-device linkを受け取りました。コピーして元のファイルを削除しますが、ファイルをコピーするコマンドも表示されません。これはどのように行うことができますか?

異なるパーティション間でファイルを移動する場合は、コピーしてリンクを解除する必要があります。これを試して、

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

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

is.pipe(os);
is.on('end',function() {
    fs.unlinkSync('source_file');
});

/* node.js 0.6 and earlier you can use util.pump:
util.pump(is, os, function() {
    fs.unlinkSync('source_file');
});
*/
51
Chandra Sekar

問題に対するもう1つの解決策。

Npmの "coolaj86"によって書かれた fs.extra というパッケージがあります。

あなたはそれを次のように使用します:_npm install fs.extra_

_fs = require ('fs.extra');
fs.move ('foo.txt', 'bar.txt', function (err) {
    if (err) { throw err; }
    console.log ("Moved 'foo.txt' to 'bar.txt'");
});
_

このことのソースコードを読みました。標準のfs.rename()を実行しようとしますが、失敗した場合は、@ chandruが使用するのと同じutil.pump()を使用して、コピーを実行し、元の関数を削除します。

7
erapert

私はこれがすでに答えられていることを知っていますが、私は同様の問題に遭遇し、次のようなものに行き着きました:

require('child_process').spawn('cp', ['-r', source, destination])

これは、コマンドcp( "copy")を呼び出します。 Node.jsの外部にステップしているため、このコマンドはシステムでサポートされている必要があります。

私はそれが最もエレガントではないことを知っています、しかしそれは私が必要としたことをしました:)

6
Justin

モジュールをインポートしてpackage.jsonファイルに保存します

npm install mv --save

次に、次のように使用します。

var mv = require('mv');

mv('source_file', 'destination_file', function (err) {
    if (err) {
        throw err;
    }
    console.log('file moved successfully');
});
4
ehrhardt

私はあなたのためにそれを処理するNode.jsモジュールを作りました。同じパーティション内で移動するかどうかを考える必要はありません。これは、最近のfs.copyFile() Node.js APIを使用して、別のパーティション/ディスクに移動するときにファイルをコピーするため、利用可能な最速のソリューションです。

インストールするだけです move-file

$ npm install move-file

次に、次のように使用します。

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

(async () => {
    await moveFile(fromPath, toPath);
    console.log('File moved');
})();
2
Sindre Sorhus