天天看點

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