var fs = require('fs'); var path_lib = require("path"); var charset = "utf-8"; if (!fs.existsSync) fs.existsSync = path_lib.existsSync; // node < 0.8 /** * 保存数据到指定文件 * @param path 文件完整路径名 * @param data 要保存的数据 */ function save(path,data){ if(exists(path)) { remove(path); } path = escapePath(path); createDirectory(path_lib.dirname(path)); fs.writeFileSync(path,data,charset); } /** * 创建文件夹 */ function createDirectory(path, mode, made) { path = escapePath(path); if (mode === undefined) { mode = 0777 & (~process.umask()); } if (!made) made = null; if (typeof mode === 'string') mode = parseInt(mode, 8); path = path_lib.resolve(path); try { fs.mkdirSync(path, mode); made = made || path; } catch (err0) { switch (err0.code) { case 'ENOENT' : made = createDirectory(path_lib.dirname(path), mode, made); createDirectory(path, mode, made); break; default: var stat; try { stat = fs.statSync(path); } catch (err1) { throw err0; } if (!stat.isDirectory()) throw err0; break; } } return made; } var textTemp = {}; /** * 读取文本文件,返回打开文本的字符串内容,若失败,返回"". * @param path 要打开的文件路径 */ function read(path) { path = escapePath(path); var text = textTemp[path]; if(text){ return text; } try{ text = fs.readFileSync(path,charset); text = text.replace(/^\uFEFF/, ''); } catch (err0) { return ""; } if(text){ var ext = getExtension(path).toLowerCase(); if(ext=="ts"||ext=="exml"){ textTemp[path] = text; } } return text; } /** * 读取字节流文件,返回字节流,若失败,返回null. * @param path 要打开的文件路径 */ function readBinary(path) { path = escapePath(path); try{ var binary = fs.readFileSync(path); } catch (e) { return null; } return binary; } /** * 复制文件或目录 * @param source 文件源路径 * @param dest 文件要复制到的目标路径 */ function copy(source, dest) { source = escapePath(source); dest = escapePath(dest); var stat = fs.lstatSync(source); if (stat.isDirectory()) { _copy_dir(source, dest); } else { _copy_file(source, dest); } } function isDirectory(path){ path = escapePath(path); try{ var stat = fs.statSync(path); } catch(e){ return false; } return stat.isDirectory(); } function isSymbolicLink(path){ path = escapePath(path); try{ var stat = fs.statSync(path); } catch(e){ return false; } return stat.isSymbolicLink(); } function isFile(path){ path = escapePath(path); try{ var stat = fs.statSync(path); } catch(e){ return false; } return stat.isFile(); } function _copy_file(source_file, output_file) { createDirectory(path_lib.dirname(output_file)) var byteArray = fs.readFileSync(source_file); fs.writeFileSync(output_file, byteArray); } function _copy_dir(sourceDir, outputDir) { createDirectory(outputDir); var list = fs.readdirSync(sourceDir); list.forEach(function (fileName) { copy(path_lib.join(sourceDir, fileName), path_lib.join(outputDir, fileName)); }); } /** * 删除文件或目录 * @param path 要删除的文件源路径 */ function remove(path) { path = escapePath(path); try{ fs.lstatSync(path).isDirectory() ? rmdir(path) : fs.unlinkSync(path) } catch (e){ } } function rmdir(path) { var files = []; if( fs.existsSync(path) ) { files = fs.readdirSync(path); files.forEach(function(file){ var curPath = path + "/" + file; if(fs.statSync(curPath).isDirectory()) { rmdir(curPath); } else { fs.unlinkSync(curPath); } }); fs.rmdirSync(path); } } /** * 返回指定文件的父级文件夹路径,返回字符串的结尾已包含分隔符。 */ function getDirectory(path) { path = escapePath(path); return path_lib.dirname(path)+"/"; } /** * 获得路径的扩展名,不包含点字符。 */ function getExtension(path) { path = escapePath(path); var index = path.lastIndexOf("."); if(index==-1) return ""; var i = path.lastIndexOf("/"); if(i>index) return ""; return path.substring(index+1); } /** * 获取路径的文件名(不含扩展名)或文件夹名 */ function getFileName(path) { if (!path) return ""; path = escapePath(path); var startIndex = path.lastIndexOf("/"); var endIndex; if (startIndex > 0 && startIndex == path.length - 1) { path = path.substring(0, path.length - 1); startIndex = path.lastIndexOf("/"); endIndex = path.length; return path.substring(startIndex + 1, endIndex); } endIndex = path.lastIndexOf("."); if (endIndex == -1) endIndex = path.length; return path.substring(startIndex + 1, endIndex); } /** * 获取指定文件夹下的文件或文件夹列表,不包含子文件夹内的文件。 * @param path 要搜索的文件夹 * @param relative 是否返回相对路径,若不传入或传入false,都返回绝对路径。 */ function getDirectoryListing(path){ var relative = arguments[1]; path = escapePath(path); try{ var list = fs.readdirSync(path); } catch (e){ return []; } if(!relative){ var length = list.length; for(var i = 0;i