如何将文件 a 移动到 Node.js 中的不同分区或设备?

IT技术 javascript node.js rename
2021-03-06 01:00:50

我正在尝试在 Node.js 脚本中将文件从一个分区移动到另一个分区。当我使用时,fs.renameSync我收到了Error: EXDEV, Cross-device link. 我会复制它并删除原始文件,但我也没有看到复制文件的命令。如何才能做到这一点?

5个回答

跨不同分区移动文件时,您需要复制和取消链接。试试这个,

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');
});
*/
对我来说,是输入流发送end事件而不是输出流。所以:is.pipe(os)is.on('end', function(){});工作。
2021-04-26 01:00:50
这不是非常耗费资源吗?
2021-05-02 01:00:50
util.pump 已弃用。使用 is.pipe(os) 然后监听输出流上的 'end' 事件。
2021-05-07 01:00:50
而且,与其他解决方案不同,清理源目录。
2021-05-12 01:00:50
你为什么使用fs.unlinkSync而不是fs.unlink
2021-05-16 01:00:50

我知道这已经得到了回答,但我遇到了类似的问题并最终得到了以下内容:

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

这样做是调用命令cp(“复制”)。由于我们是在 Node.js 之外进行的,因此您的系统需要支持此命令。

我知道它不是最优雅的,但它满足了我的需求:)

如果您不需要支持 Windows,这很好
2021-04-23 01:00:50
@Lloyd 所以它总是很好 :D
2021-05-18 01:00:50

问题的另一种解决方案。

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(),如果失败,它会复制并使用util.pump()@chandru 使用的相同内容删除原始文件。

fs-extra 包的作者是 jprichardson,coolaj86 是贡献者(更多信息请参见github.com/jprichardson/node-fs-extra)。
2021-05-04 01:00:50
顺便说一下,我已经在 github 上与 coolaj86 进行了交谈,他知道 util.pump() 在节点 0.10 中已被弃用,并将很快修复该问题。
2021-05-14 01:00:50

导入module并将其保存到您的 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 的合适替代品,因为它不是同步的。github.com/andrewrk/node-mv/issues/9
2021-05-14 01:00:50

我制作了一个 Node.js module来为你处理它。您不必考虑它是否会在同一分区内移动。这是最快的解决方案,因为它使用最新的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');
})();