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

riz*_*oro 125 file node.js express

如何在node.js上移动文件(如mv命令shell)?是否有任何方法或我应该读取文件,写入新文件并删除旧文件?

riz*_*oro 139

根据seppo0010评论,我使用重命名功能来做到这一点.

http://nodejs.org/docs/latest/api/fs.html#fs_fs_rename_oldpath_newpath_callback

fs.rename(oldPath,newPath,callback)

添加于:v0.0.2

oldPath <String> | <Buffer>
newPath <String> | <Buffer>
callback <Function>
Run Code Online (Sandbox Code Playgroud)

异步重命名(2).除了可能的异常之外,没有给完成回调的参数.

  • 如果您跨越分区或使用不支持移动文件的虚拟文件系统,则无法使用此功能.您最好使用[此解决方案](http://stackoverflow.com/a/29105404/532695)并使用副本回退 (6认同)
  • 对于那些想知道@ seppo0010的评论去哪里的人:这是我的答案,我删除并发布作为对OP的评论. (5认同)

Teo*_*ahi 42

此示例取自:Action.js in Action

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 像魅力一样工作。谢谢!如果我可以补充一点:'move'在取消oldPath链接时可能是一个更好的名称。 (3认同)

and*_*wrk 27

使用mv节点模块,它将首先尝试执行fs.rename,然后回退到复制然后取消链接.

  • 这个dev依存关系如何?该应用是否不需要mv才能正常运行? (3认同)
  • andrewrk 似乎是这个“mv”节点模块的作者。我喜欢使用 npm 来安装;`npm install mv --save-dev`; 这是 [npm 链接](https://www.npmjs.com/package/mv) (2认同)

Han*_*ani 18

本地使用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!')
})
Run Code Online (Sandbox Code Playgroud)


dea*_*unk 17

util.pump 在节点0.10中已弃用并生成警告消息

 util.pump() is deprecated. Use readableStream.pipe() instead
Run Code Online (Sandbox Code Playgroud)

因此,使用流复制文件的解决方案是:

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 */ });
Run Code Online (Sandbox Code Playgroud)

  • 这是复制/移动两个不同分区上的文件的正确方法.谢谢! (2认同)

vor*_*laz 11

对大于 8.0.0 的 Node 版本使用 promise:

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();
Run Code Online (Sandbox Code Playgroud)

  • 如果您在具有卷的 Docker 环境中,请注意`fs.rename` 不起作用。 (6认同)
  • 您也可以只执行`const {promises} = require("fs")`,然后使用`promises.rename`(然后不需要`util`) (2认同)

iul*_*lia 8

使用重命名功能:

fs.rename(getFileName, __dirname + '/new_folder/' + getFileName); 
Run Code Online (Sandbox Code Playgroud)

哪里

getFilename = file.extension (old path)
__dirname + '/new_folder/' + getFileName
Run Code Online (Sandbox Code Playgroud)

假设你想保持文件名不变.

  • 如果您尝试在不同分区之间重命名文件,请注意这不起作用,在某些虚拟文件系统上(例如docker) (4认同)

mik*_*eym 8

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!")
})
Run Code Online (Sandbox Code Playgroud)


ale*_*lex 5

这是一个使用util.pump的例子,来自>> 如何将文件a移动到Node.js中的不同分区或设备?

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');
});
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,在跨卷移动文件时只需执行此操作.否则,您可以使用[`fs.rename()`](http://nodejs.org/docs/latest/api/fs.html#fs.rename)(在一个卷中重命名文件并移动它是一样). (20认同)

小智 5

fs.rename同步版本也可用:

fs.renameSync(oldPath, newPath)
Run Code Online (Sandbox Code Playgroud)