nodejs跨服务器拷贝文件,纯异步nodejs文件夹(目录)复制功能

node.js 复制文件夹

思路:

1、callback 驱动

2、递归所有需要复制文件

3、在一定阀值下并发复制文件

var async = require("async");

var fs = require("fs");

var path = require("path");

// cursively make dir

function mkdirs(p, mode, f, made) {

if (typeof mode === 'function' || mode === undefined) {

f = mode;

mode = 0777 & (~process.umask());

}

if (!made)

made = null;

var cb = f || function () {};

if (typeof mode === 'string')

mode = parseInt(mode, 8);

p = path.resolve(p);

fs.mkdir(p, mode, function (er) {

if (!er) {

made = made || p;

return cb(null, made);

}

switch (er.code) {

case 'ENOENT':

mkdirs(path.dirname(p), mode, function (er, made) {

if (er) {

cb(er, made);

} else {

mkdirs(p, mode, cb, made);

}

});

break;

// In the case of any other error, just see if there's a dir

// there already. If so, then hooray! If not, then something

// is borked.

default:

fs.stat(p, function (er2, stat) {

// if the stat fails, then that's super weird.

// let the original error be the failure reason.

if (er2 || !stat.isDirectory()) {

cb(er, made);

} else {

cb(null, made)

};

});

break;

}

});

}

// single file copy

function copyFile(file, toDir, cb) {

async.waterfall([

function (callback) {

fs.exists(toDir, function (exists) {

if (exists) {

callback(null, false);

} else {

callback(null, true);

}

});

}, function (need, callback) {

if (need) {

mkdirs(path.dirname(toDir), callback);

} else {

callback(null, true);

}

}, function (p, callback) {

var reads = fs.createReadStream(file);

var writes = fs.createWriteStream(path.join(path.dirname(toDir), path.basename(file)));

reads.pipe(writes);

//don't forget close the when all the data are read

reads.on("end", function () {

writes.end();

callback(null);

});

reads.on("error", function (err) {

console.log("error occur in reads");

callback(true, err);

});

}

], cb);

}

// cursively count the files that need to be copied

function _ccoutTask(from, to, cbw) {

async.waterfall([

function (callback) {

fs.stat(from, callback);

},

function (stats, callback) {

if (stats.isFile()) {

cbw.addFile(from, to);

callback(null, []);

} else if (stats.isDirectory()) {

fs.readdir(from, callback);

}

},

function (files, callback) {

if (files.length) {

for (var i = 0; i < files.length; i++) {

_ccoutTask(path.join(from, files[i]), path.join(to, files[i]), cbw.increase());

}

}

callback(null);

}

], cbw);

}

// wrap the callback before counting

function ccoutTask(from, to, cb) {

var files = [];

var count = 1;

function wrapper(err) {

count--;

if (err || count <= 0) {

cb(err, files)

}

}

wrapper.increase = function () {

count++;

return wrapper;

}

wrapper.addFile = function (file, dir) {

files.push({

file : file,

dir : dir

});

}

_ccoutTask(from, to, wrapper);

}

function copyDir(from, to, cb) {

if(!cb){

cb=function(){};

}

async.waterfall([

function (callback) {

fs.exists(from, function (exists) {

if (exists) {

callback(null, true);

} else {

console.log(from + " not exists");

callback(true);

}

});

},

function (exists, callback) {

fs.stat(from, callback);

},

function (stats, callback) {

if (stats.isFile()) {

// one file copy

copyFile(from, to, function (err) {

if (err) {

// break the waterfall

callback(true);

} else {

callback(null, []);

}

});

} else if (stats.isDirectory()) {

ccoutTask(from, to, callback);

}

},

function (files, callback) {

// prevent reaching to max file open limit

async.mapLimit(files, 10, function (f, cb) {

copyFile(f.file, f.dir, cb);

}, callback);

}

], cb);

}

var start = new Date().getTime();

copyDir("F:\\gear", "F:\\gear2", function (err) {

if (err) {

console.log("error ocur");

console.dir(err);

} else {

console.log("copy ok");

console.log("consume time:" + (new Date().getTime() - start))

}

});

总结

以上所述是小编给大家介绍的纯异步nodejs文件夹(目录)复制,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Node.js中,你可以使用`fs`模块来复制文件到指定目录。下面是一个简单的示例代码: ```javascript const fs = require('fs'); const path = require('path'); function copyFile(sourcePath, targetPath) { // 构造目标文件路径 const fileName = path.basename(sourcePath); const targetFilePath = path.join(targetPath, fileName); // 创建可读流和可写流 const readStream = fs.createReadStream(sourcePath); const writeStream = fs.createWriteStream(targetFilePath); // 执行文件复制 readStream.pipe(writeStream); // 监听复制完成事件 writeStream.on('finish', () => { console.log('文件复制成功!'); }); // 监听错误事件 writeStream.on('error', (err) => { console.error('文件复制失败:', err); }); } // 使用示例 const sourcePath = '/path/to/source/file.txt'; const targetPath = '/path/to/target/directory'; copyFile(sourcePath, targetPath); ``` 上述代码中,我们首先引入了`fs`和`path`模块。然后定义了一个`copyFile`函数,该函数接受源文件路径和目标目录路径作为参数。 在函数内部,我们使用`path.basename`方法获取源文件文件名,并使用`path.join`方法构造目标文件的完整路径。 接下来,我们使用`fs.createReadStream`创建一个可读流,用于读取源文件的内容。同时,使用`fs.createWriteStream`创建一个可写流,用于将内容写入目标文件。 然后,我们使用`readStream.pipe(writeStream)`将可读流的内容传输到可写流中,实现文件复制。 最后,我们监听可写流的`finish`事件,表示文件复制完成。如果复制过程中发生错误,我们监听可写流的`error`事件,并打印错误信息。 你可以根据实际情况修改源文件路径和目标目录路径,然后调用`copyFile`函数进行文件复制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值