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