Nodejs Error: EXDEV, Cross-device link
Nodejs Error: EXDEV, Cross-device link
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’); });
http://stackoverflow.com/questions/4568689/how-do-i-move-file-a-to-a-different-partition-in-node-js
Node.js Error: EXDEV, Cross-device link
在Node.js中,当你尝试移动或重命名文件到不同的文件系统(例如从一个磁盘分区移动到另一个)时,可能会遇到 EXDEV
错误。这是因为Node.js的内置文件操作方法(如 fs.rename()
)不能跨文件系统进行重命名或移动。
示例代码及问题描述
假设你有一个简单的脚本,用于将一个文件从源路径复制到目标路径,然后删除源文件:
var fs = require('fs');
var util = require('util');
var is = fs.createReadStream('source_file');
var os = fs.createWriteStream('destination_file');
util.pump(is, os, function() {
fs.unlinkSync('source_file'); // 尝试删除源文件
});
在这个例子中,如果源文件和目标文件位于不同的磁盘分区上,fs.unlinkSync('source_file')
将会失败,并抛出 EXDEV
错误。
解决方案
解决这个问题的方法是先将文件从源位置读取并写入目标位置,然后再删除源文件。这种方法虽然简单,但适用于大多数情况:
var fs = require('fs');
var path = require('path');
// 源文件路径
var sourcePath = 'source_file';
// 目标文件路径
var destinationPath = 'destination_file';
// 创建可读流
var readStream = fs.createReadStream(sourcePath);
// 创建可写流
var writeStream = fs.createWriteStream(destinationPath);
// 将数据从源文件读取并写入目标文件
readStream.pipe(writeStream, { end: false });
writeStream.on('finish', function () {
// 当写入完成时,删除源文件
fs.unlink(sourcePath, function (err) {
if (err) {
console.error('Error deleting source file:', err);
} else {
console.log('Source file deleted successfully.');
}
});
});
writeStream.on('error', function (err) {
console.error('Error writing to destination file:', err);
});
解释
- 创建流:使用
fs.createReadStream()
和fs.createWriteStream()
分别创建可读流和可写流。 - 管道操作:使用
pipe()
方法将读取的数据直接传输到写入流。 - 错误处理:监听
writeStream
的error
事件,以便捕获任何写入过程中可能出现的错误。 - 删除源文件:当写入操作完成时,在
writeStream
的finish
事件中删除源文件。
这种方法确保了即使在不同文件系统之间移动文件,也能正确地复制数据并删除原始文件。