File 如何在node.js中移动文件?
如何在node.js上移动文件(如mv command shell)?有什么方法可以做到这一点,或者我应该读取文件、写入新文件并删除旧文件吗?下面是一个使用util.pump的示例,来自>>File 如何在node.js中移动文件?,file,node.js,express,File,Node.js,Express,如何在node.js上移动文件(如mv command shell)?有什么方法可以做到这一点,或者我应该读取文件、写入新文件并删除旧文件吗?下面是一个使用util.pump的示例,来自>> 根据seppo0010注释,我使用了rename函数来实现这一点 fs.rename(旧路径、新路径、回调) 加入:v0.0.2 oldPath| 新路径| 回拨 异步重命名(2)。除了可能的异常之外,没有其他参数 被赋予完成回调 使用节点模块,该模块将首先尝试执行fs.rename,然后回退到复制然后
根据seppo0010注释,我使用了rename函数来实现这一点 fs.rename(旧路径、新路径、回调) 加入:v0.0.2
oldPath|
新路径|
回拨
异步重命名(2)。除了可能的异常之外,没有其他参数
被赋予完成回调
使用节点模块,该模块将首先尝试执行
fs.rename
,然后回退到复制然后取消链接。util.pump
在节点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 */ });
如果您试图移动或重命名node.js源文件,请尝试以下操作。它将更新所有其他文件中对该文件的引用。此示例取自: 一个move()函数,如果可能的话,它可以重命名,或者返回到复制
使用重命名功能:
fs.rename(getFileName, __dirname + '/new_folder/' + getFileName);
在哪里
假设您希望保持文件名不变。通过
fs extra
模块,您可以使用它的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!")
})
这是对的重新命名,名称不那么模棱两可,并且遵循在尝试调用代码之前定义代码的设计原则。(虽然node允许您执行其他操作,但本末倒置并不是一种好的做法。)
函数重命名或复制和删除(旧路径、新路径、回调){
函数复制和删除(){
var readStream=fs.createReadStream(oldPath);
var writeStream=fs.createWriteStream(newPath);
readStream.on('error',回调);
writeStream.on('错误',回调);
readStream.on('close',
函数(){
fs.unlink(oldPath,回调);
}
);
readStream.pipe(writeStream);
}
fs.重命名(旧路径、新路径、,
功能(err){
如果(错误){
如果(err.code=='EXDEV'){
复制和删除();
}否则{
回调(err);
}
返回;//本机使用nodejs
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”)对大于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();
只需我的2美分,如:copy()方法中所述,不应按原样用于复制文件,而无需稍加调整:
function copy(callback) {
var readStream = fs.createReadStream(oldPath);
var writeStream = fs.createWriteStream(newPath);
readStream.on('error', callback);
writeStream.on('error', callback);
// Do not callback() upon "close" event on the readStream
// readStream.on('close', function () {
// Do instead upon "close" on the writeStream
writeStream.on('close', function () {
callback();
});
readStream.pipe(writeStream);
}
包装在承诺中的复制功能:
function copy(oldPath, newPath) {
return new Promise((resolve, reject) => {
const readStream = fs.createReadStream(oldPath);
const writeStream = fs.createWriteStream(newPath);
readStream.on('error', err => reject(err));
writeStream.on('error', err => reject(err));
writeStream.on('close', function() {
resolve();
});
readStream.pipe(writeStream);
})
但是,请记住,如果目标文件夹不存在,文件系统可能会崩溃。我会将所有涉及的功能(例如,重命名
,复制
,取消链接
)彼此分离,以获得灵活性并实现所有功能,当然:
const renameFile = (path, newPath) =>
new Promise((res, rej) => {
fs.rename(path, newPath, (err, data) =>
err
? rej(err)
: res(data));
});
const copyFile = (path, newPath, flags) =>
new Promise((res, rej) => {
const readStream = fs.createReadStream(path),
writeStream = fs.createWriteStream(newPath, {flags});
readStream.on("error", rej);
writeStream.on("error", rej);
writeStream.on("finish", res);
readStream.pipe(writeStream);
});
const unlinkFile = path =>
new Promise((res, rej) => {
fs.unlink(path, (err, data) =>
err
? rej(err)
: res(data));
});
const moveFile = (path, newPath, flags) =>
renameFile(path, newPath)
.catch(e => {
if (e.code !== "EXDEV")
throw new e;
else
return copyFile(path, newPath, flags)
.then(() => unlinkFile(path));
});
moveFile
只是一个方便的函数,我们可以单独应用这些函数,例如,当我们需要更细粒度的异常处理时。借助下面的URL,您可以将文件当前源复制或移动到目标源
/*******将$file移动到$dir2 Start*********/
var moveFile=(文件,dir2)=>{
//包括fs、path模块
var fs=需要('fs');
var path=require('path');
//获取文件名并将其添加到dir2
var f=path.basename(文件);
var dest=路径解析(dir2,f);
fs.重命名(文件,目标,(错误)=>{
如果(错误)抛出错误;
else console.log(“已成功移动”);
});
};
//将file1.htm从“test/”移动到“test/dir\u 1/”
moveFile('./test/file1.htm','./test/dir_1/');
/*********将$file移动到$dir2 END*********/
/*********将$file复制到$dir2 Start*********/
var copyFile=(文件,dir2)=>{
//包括fs、path模块
var fs=需要('fs');
var path=require('path');
//获取文件名并将其添加到dir2
var f=path.basename(文件);
var source=fs.createReadStream(文件);
var dest=fs.createWriteStream(path.resolve(dir2,f));
来源.管道(目的地);
on('end',function(){console.log('successfully copied');});
on('error',function(err){console.log(err);});
};
//例如,将file1.htm从“test/dir_1/”复制到“test/”
复制文件('./test/dir_1/file1.htm','./test/');
/*********将$file复制到$dir2 END******/
是一个非常方便的解决方案
命令:
mv([选项,]源,目标)
可用选项:
-f:力(默认行为)
-n:防止覆盖
const shell = require('shelljs');
const status = shell.mv('README.md', '/home/my-dir');
if(status.stderr) console.log(status.stderr);
else console.log('File moved!');
Node.js v10.0.0+
const fs = require('fs')
const { promisify } = require('util')
const pipeline = promisify(require('stream').pipeline)
await pipeline(
fs.createReadStream('source/file/path'),
fs.createWriteStream('destination/file/path')
).catch(err => {
// error handling
})
fs.unlink('source/file/path')
值得注意的是,您只需在跨卷移动文件时执行此操作。否则,您可以使用(在卷内重命名文件和移动文件是同一件事)。是否可以将文件从本地计算机移动到服务器?不,您需要使用其他方法(如使用FTP、HTTP或其他协议)。对于那些想知道@seppo0010的评论去了哪里的人:这是在我的答案上,我将其删除并作为评论发布在OP上。如果您正在跨分区或使用不支持移动文件的虚拟文件系统,这将不起作用。您最好与副本回退一起使用这是复制/移动位于两个不同分区上的文件的正确方法。谢谢!对于移动文件的简单要求来说效果很好。andrewrk似乎是这个mv
节点模块的作者。我喜欢使用npm来安装;npm安装mv——保存dev
;这是一个dev依赖项如何工作的问题?应用程序不需要mv才能正常工作吗?如果尝试重命名不同分区之间的文件,在某些虚拟文件系统上(如docker
function copy(callback) {
var readStream = fs.createReadStream(oldPath);
var writeStream = fs.createWriteStream(newPath);
readStream.on('error', callback);
writeStream.on('error', callback);
// Do not callback() upon "close" event on the readStream
// readStream.on('close', function () {
// Do instead upon "close" on the writeStream
writeStream.on('close', function () {
callback();
});
readStream.pipe(writeStream);
}
function copy(oldPath, newPath) {
return new Promise((resolve, reject) => {
const readStream = fs.createReadStream(oldPath);
const writeStream = fs.createWriteStream(newPath);
readStream.on('error', err => reject(err));
writeStream.on('error', err => reject(err));
writeStream.on('close', function() {
resolve();
});
readStream.pipe(writeStream);
})
const renameFile = (path, newPath) =>
new Promise((res, rej) => {
fs.rename(path, newPath, (err, data) =>
err
? rej(err)
: res(data));
});
const copyFile = (path, newPath, flags) =>
new Promise((res, rej) => {
const readStream = fs.createReadStream(path),
writeStream = fs.createWriteStream(newPath, {flags});
readStream.on("error", rej);
writeStream.on("error", rej);
writeStream.on("finish", res);
readStream.pipe(writeStream);
});
const unlinkFile = path =>
new Promise((res, rej) => {
fs.unlink(path, (err, data) =>
err
? rej(err)
: res(data));
});
const moveFile = (path, newPath, flags) =>
renameFile(path, newPath)
.catch(e => {
if (e.code !== "EXDEV")
throw new e;
else
return copyFile(path, newPath, flags)
.then(() => unlinkFile(path));
});
const shell = require('shelljs');
const status = shell.mv('README.md', '/home/my-dir');
if(status.stderr) console.log(status.stderr);
else console.log('File moved!');
const fs = require('fs')
const { promisify } = require('util')
const pipeline = promisify(require('stream').pipeline)
await pipeline(
fs.createReadStream('source/file/path'),
fs.createWriteStream('destination/file/path')
).catch(err => {
// error handling
})
fs.unlink('source/file/path')