如何在node.js上移动文件?
如何在node.js上移动文件(如mv command shell)? 是否有任何方法,或者我需要读取文件,写入新文件,并删除旧文件?
根据seppo0010评论,我用重命名function来做到这一点。
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>
asynchronous重命名(2)。 完成callback没有给出可能的exception之外的其他参数。
这个例子取自: Node.js in Action
移动()函数重命名,如果可能的话,或回落到复制
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); } }
使用mv节点模块,它将首先尝试执行fs.rename
,然后回fs.rename
复制然后取消链接。
util.pump
在节点0.10中被弃用,并生成警告消息
util.pump() is deprecated. Use readableStream.pipe() instead
所以使用stream复制文件的解决scheme是:
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 */ });
使用重命名function:
fs.rename(getFileName, __dirname + '/new_folder/' + getFileName);
哪里
getFilename = file.extension (old path) __dirname + '/new_folder/' + getFileName
假设你想保持文件名不变。
下面是一个使用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'); });
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!") })
本地使用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!') })
这是对teoman shipahi的答案的一种回应,用一个稍微不太模糊的名字,并且在尝试调用它之前遵循devise定义代码的原则。 (虽然节点允许你做其他事情,但把马车放在马前面并不是一个好习惯。)
function rename_or_copy_and_delete (oldPath, newPath, callback) { function copy_and_delete () { 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.rename(oldPath, newPath, function (err) { if (err) { if (err.code === 'EXDEV') { copy_and_delete(); } else { callback(err); } return;// << both cases (err/copy_and_delete) } callback(); } ); }
如果您正在尝试移动或重命名node.js源文件,请尝试https://github.com/viruschidai/node-mv 。 它将更新所有其他文件中对该文件的引用。