File 如何在node.js中移动文件?

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,然后回退到复制然后

如何在node.js上移动文件(如mv command shell)?有什么方法可以做到这一点,或者我应该读取文件、写入新文件并删除旧文件吗?

下面是一个使用util.pump的示例,来自>>


根据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')