/** * Created by jackyanjiaqi on 16/6/27. */ import fs = require("fs-extra-promise"); import PATH = require("path"); var charset = "utf-8"; /** * 转换本机路径为Unix风格路径。 */ export function escapePath(path:string):string { if (!path) return ""; return path.split("\\").join("/"); } /** * 读取文本文件,返回打开文本的字符串内容,若失败,返回"". * @param path 要打开的文件路径 */ export function read(path:string):string { path = escapePath(path); var text = ""; try { text = fs.readFileSync(path, charset); text = text.replace(/^\uFEFF/, ''); } catch (err0) { } return text; } export function save(path:string, data:any):void { path = escapePath(path); fs.writeFileSync(path, data, charset); } export async function readAsync(path:string):Promise{ path = escapePath(path); let text:string = ""; try { text = await fs.readFileAsync(path, charset); text = text.replace(/^\uFEFF/, ''); } catch (err0) { } return text; } /** * 使用指定扩展名搜索文件夹及其子文件夹下所有的文件 * @param dir 要搜索的文件夹 * @param extension 要搜索的文件扩展名,不包含点字符,例如:"png"。不设置表示获取所有类型文件。 */ export function search(dir:string, extension?:string):string[] { var list = []; try { var stat = fs.statSync(dir); } catch (e) { return list; } if (stat.isDirectory()) { findFiles(dir, list, extension, null); } return list; } export function searchByFunction(dir: string, filterFunc: Function, checkDir?:boolean):string[] { var list = []; try { var stat = fs.statSync(dir); } catch (e) { return list; } if (stat.isDirectory()) { findFiles(dir, list, "", filterFunc, checkDir); } return list; } export function searchAsync(dir:string,extension?:string):Promise>{ var list = []; return new Promise>((resolve,reject)=>{ fs.walk(dir) .on("data", (item: { path: string, stats: fs.Stats }) => { if (item.stats.isFile()) { let path = item.path; if (extension) { var len = extension.length; if (path.charAt(path.length - len - 1) == "." && path.substr(path.length - len, len).toLowerCase() == extension) { list.push(path); } }else { list.push(item.path); } } }) .on("end", () => { resolve(list); }); }); } function findFiles(filePath:string, list:string[], extension:string, filterFunc?:Function, checkDir?:boolean) { var files = fs.readdirSync(filePath); var length = files.length; for (var i = 0; i < length; i++) { if (files[i].charAt(0) == ".") { continue; } var path = joinPath(filePath, files[i]); var stat = fs.statSync(path); if (stat.isDirectory()) { if (checkDir) { if (!filterFunc(path)) { continue; } } findFiles(path, list, extension, filterFunc); } else if (filterFunc != null) { if (filterFunc(path)) { list.push(path); } } else if (extension) { var len = extension.length; if (path.charAt(path.length - len - 1) == "." && path.substr(path.length - len, len).toLowerCase() == extension) { list.push(path); } } else { list.push(path); } } } /** * 连接路径,支持传入多于两个的参数。也支持"../"相对路径解析。返回的分隔符为Unix风格。 */ export function joinPath(dir:string,arg1?:any,arg2?:any,arg3?:any,arg4?:any):string { var path = PATH.join.apply(null, arguments); path = escapePath(path); return path; } /** * 指定路径的文件或文件夹是否存在 */ export function exists(path:string):boolean { path = escapePath(path); return fs.existsSync(path); } export function mkDir(path:string, mode?:any, made?:any):void { path = escapePath(path); if (mode === undefined) { mode = 511 & (~process.umask()); } if (!made) made = null; if (typeof mode === 'string') mode = parseInt(mode, 8); path = PATH.resolve(path); try { fs.mkdirSync(path, mode); made = made || path; } catch (err0) { switch (err0.code) { case 'ENOENT' : made = mkDir(PATH.dirname(path), mode, made); mkDir(path, mode, made); break; default: var stat; try { stat = fs.statSync(path); } catch (err1) { throw err0; } if (!stat.isDirectory()) throw err0; break; } } return made; } /** * 删除文件或目录 * @param path 要删除的文件源路径 */ export function remove(path:string):void { 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); } }