使用 nodejs 对文件或者文件夹进行备份

var fs = require( 'fs' );
var path = require("path");

function doWork(source, dest) {
	//先判断执行哪种复制形式,看复制单个文件还是目录
	var file_name=source.replace(/(.*\/)*([^.]+).*/ig,"$2");  //正则获取文件路径中的文件名称
	
	var promise = new Promise(function (resolve, reject) {
		fs.stat(source, function (err, stats) {
			if (err) {
				reject(err);
			} else {
				var result = '';
				if (stats.isFile()) {
					result = true;
				} else {
					result = false;
				}
				resolve(result);
			}
		});
	});
	//尝试使用promise 规避异步出现的问题
	promise.then(function (result) {
		//then第一个函数是成功的回调,参数是resolve(err)中的data
		if (result == true) {
			console.log('这是个文件:' + result);
			if (fs.existsSync(dest) == false) {
				fs.mkdir(dest, (err) => {
					if (err) throw err;
				});
			}
			fs.readFile(source, function (err, data) {
				if (err) {
					throw err;
				}
				fs.writeFile(path.join(dest,file_name), data, function (err) {
					if (err) {
						throw err;
					}
				})
			});
		}else{
			existsFiles(source,dest);
		}
	}, function (err) {
		//then第二个函数是失败的回调函数,参数是reject(err)中的err错误对象
		console.log('失败:' + err);
	});
}


function copyFiles( src, dst ){
    // 读取目录中的所有文件/目录
    fs.readdir( src, function( err, paths ){
        if( err ){
            throw err;
        }
  
        paths.forEach(function( path ){
            var file_src = path.join(src , path),
                file_dst = path.join(dst , path),
                readable, writable;      
		
            fs.stat( file_src, function( err, st ){
                if( err ){
                    throw err;
                }
                // 判断是否为文件
                if( st.isFile() ){
                    // 创建读取流
                    readable = fs.createReadStream( file_src );
                    // 创建写入流
                    writable = fs.createWriteStream( file_dst ); 
                    // 通过管道来传输流
                    readable.pipe( writable );
                }
                // 如果是目录则递归调用再次判断该文件夹是否存在
                else if( st.isDirectory() ){
                    existsFiles( file_src, file_dst, copyFiles );
                }
            });
        });
    });
};


// 在复制目录前需要判断该目录是否存在,不存在需要先创建目录
function existsFiles(source, dest) {
	//换个同步,exists 方法被废弃了,以下有使用exists注释掉的用法
	if (fs.existsSync(dest)) {
		copyFiles(source, dest);
	} else {
		fs.mkdir(dest, (err) => {
			if (err) {
				console.log(err);
			}else{
				copyFiles(source, dest);
			}
		});
	}
	/*
	fs.exists(dest, function (exists) {
		// 已存在
		if (exists) {
			callback(source, dest);
		}
		// 不存在
		else {
			fs.mkdir(dest, function () {
				callback(source, dest);
			});
		}
	});
	*/
};
// 复制目录

doWork( '/Users/mac/Downloads/views', '/Users/mac/Downloads/viewscopy');
//doWork( '/Users/mac/Downloads/a.js', '/Users/mac/Downloads/viewscopy');
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值