UNPKG

3.27 kBJavaScriptView Raw
1'use strict';
2
3let fs = require('fs');
4let path = require('path');
5let yaml = require('js-yaml');
6
7exports.readJSON = function(loc){
8 try {
9 return JSON.parse(fs.readFileSync(loc, 'utf8'));
10 } catch (err) {
11 err.message = `${loc}: ${err.message}`;
12 throw err;
13 }
14};
15
16exports.readYAML = function(loc) {
17 try {
18 return yaml.safeLoad(fs.readFileSync(loc, 'utf-8')) || {};
19 } catch (err) {
20 err.message = `${loc}: ${err.message}`;
21 throw err;
22 }
23};
24
25exports.readJS = function(loc){
26 try {
27 delete require.cache[loc];
28 return require(loc);
29 } catch (err) {
30 err.message = `${loc}: ${err.message}`;
31 throw err;
32 }
33};
34
35exports.fileExists = function(filePath) {
36 try {
37 return fs.statSync(filePath).isFile();
38 } catch (err) {
39 return false;
40 }
41};
42
43exports.dirExists = function(dirPath) {
44 try {
45 return fs.statSync(dirPath).isDirectory();
46 } catch (err) {
47 return false;
48 }
49};
50
51/**
52 * @function readFile
53 * @param {string} loc 需要读取的文件的完整路径
54 * @return {object}
55 * @description 该方法接受一个文件路径作为参数,把文件内容解析为 JavaScript 对象后返回
56 * 如果文件不存在,返回空对象。
57 */
58exports.readFile = function(loc){
59 let content = null;
60 switch (path.extname(loc)) {
61 case '.js':
62 content = exports.readJS(loc);
63 break;
64 case '.json':
65 content = exports.readJSON(loc);
66 break;
67 case '.yml':
68 case '.yaml':
69 content = exports.readYAML(loc);
70 break;
71 default:
72 break;
73 }
74 return content;
75};
76
77/**
78 * @function readFileAny
79 * @param {array} files 尝试读取的文件列表
80 * @return {object}
81 * @description 尝试对一组文件进行读取,找到第一个存在的文件,并返回解析得到的
82 * JavaScript 对象,如果所有文件都不存在,返回空对象。
83 *
84 */
85exports.readFileAny = function(files){
86 for(const file of files){
87 if(fs.existsSync(file)){
88 return exports.readFile(file);
89 }
90 }
91 return null;
92};
93
94
95/**
96 * @function deleteFolderRecursive
97 * @param {array} files 尝试读取的文件列表
98 * @return {object}
99 * @description 尝试对一组文件进行读取,找到第一个存在的文件,并返回解析得到的
100 * JavaScript 对象,如果所有文件都不存在,返回空对象。
101 *
102 */
103exports.deleteFolderRecursive = function(filePath, remainRootDir) {
104 if (fs.existsSync(filePath)) {
105 fs.readdirSync(filePath).forEach((file) => {
106 const currentPath = filePath + '/' + file;
107 if (fs.lstatSync(currentPath).isDirectory()) { // recurse
108 exports.deleteFolderRecursive(currentPath);
109 } else { // delete file
110 fs.unlinkSync(currentPath);
111 }
112 });
113
114 if(!remainRootDir) {
115 fs.rmdirSync(filePath);
116 }
117 }
118};
119
120exports.getFileSize = function(filename) {
121 try {
122 const stats = fs.statSync(filename);
123
124 return stats['size'] > 1024
125 ? (stats['size'] / 1024).toFixed(2) + ' KB'
126 : stats['size'] + ' Bytes';
127 } catch (err) {
128 return null;
129 }
130};