如何在Node.js中移动文件(类似于mv命令行)?有没有相应的方法,还是需要读取文件,同时将其写入新文件并删除旧文件?
fs.rename(oldPath, newPath, callback)
添加于:v0.0.2
oldPath <String> | <Buffer> newPath <String> | <Buffer> callback <Function>
异步重命名(rename(2))。完成回调函数除了可能的异常之外没有其他参数。
使用原生的Node.js
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 2015年9月2日12:50)
这个例子摘自:Node.js实战
一个移动(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);
}
}
fs-extra
模块允许您使用其move()
方法完成此操作。如果您想要完全将文件从一个目录移动到另一个目录(即从源文件夹中删除文件),则我已经实现了它并且它工作正常。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!")
})
util.pump
在 Node 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 */ });
使用Promise来处理Node版本大于8.0.0的情况:
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();
fs.rename
将无法正常工作。 - Atul YadavmoveThem
函数中添加一个 async
声明。 - H_Iconst { promises } = require("fs")
,然后使用 promises.rename
(这样就不需要使用 util
了)。 - Robin Métral使用rename函数:
fs.rename(getFileName, __dirname + '/new_folder/' + getFileName);
where
getFilename = file.extension (old path)
__dirname + '/new_folder/' + getFileName
fs.rename
同样也有同步版本:
fs.renameSync(oldPath, newPath)
下面是一个使用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');
});
cpSync
函数。 - TalesMGodois