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');