如何在Node.js中将文件从一个分区或设备移动到另一个分区或设备?

34

我正在尝试在Node.js脚本中将文件从一个分区移动到另一个分区。当我使用fs.renameSync时,我收到了Error: EXDEV, Cross-device link错误。我可以将其复制并删除原始文件,但我没有看到复制文件的命令。如何完成这个任务?

5个回答

55

在不同分区之间移动文件时,您需要进行复制和取消链接。 请尝试以下操作:

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

1
这难道不会占用很多资源吗? - Thomaschaaf
7
util.pump已经被弃用,请使用is.pipe(os)并在输出流上监听'end'事件来代替。 - andrewrk
1
对我来说,是输入流发送了 end 事件而不是输出流。所以:is.pipe(os)is.on('end', function(){}); 起作用了。 - Barış Uşaklı
2
为什么要使用 fs.unlinkSync 而不是 fs.unlink - EaterOfCode
能否将文件从本地机器移动到服务器? - Hulk1991
显示剩余2条评论

8

解决问题的另一个方法。

有一个名为fs.extra的包,由npm上的“coolaj86”编写。

使用以下命令安装: 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(),如果失败,则使用相同的util.pump()进行复制并删除原始文件。

顺便说一下,我在 Github 上与 coolaj86 联系过,他知道 util.pump() 在 Node 0.10 中已被弃用,并将很快修复该问题。 - erapert
fs-extra包的作者是jprichardson,而coolaj86是贡献者(请参见https://github.com/jprichardson/node-fs-extra了解更多信息)。 - davidbourguignon

7

我知道这个问题已经有答案了,但是我遇到了类似的问题,最终得到了以下解决方案:

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

此操作调用命令cp("copy"),因为我们要跳出Node.js环境,所以需要您的系统支持此命令。

我知道这不是最优雅的解决方案,但它满足了我的需求 :)


如果您不需要支持Windows,那么这是可以的。 - Lloyd
4
@Lloyd所说的一直都很好:D - ruX

4

导入模块并将其保存到您的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');
});

这不是fs.renameSync的合适替代品,因为它不是同步的。https://github.com/andrewrk/node-mv/issues/9 - Michael

4
我制作了一个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');
})();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接