通过PHP文件操作,简单实现一个文档编写工具,http://tp.koyole.top/doc/index

1.主要功能

  • 0.使用文件操作替代数据
  • 1.获取指定目录下的文件结构映射到前端页面
  • 2.通过文件操作提供增加编辑删除
  • 3.markdown的解析与渲染

2.PHP方法

文件内容读写

  • file_get_contnets($path);
  • file_put_contents($path, $content);

判断文件或目录

  • is_file($path);
  • is_dir($path);

文件信息

  • pathinfo($path);

文件操作

  • touch();
  • mkdir();
  • unlink();
  • rmdir();

目录操作

  • scandir()
  • opendir()
  • readdir()
  • closedir()

3.文件类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
/**
* 文件
*/
class YLFile
{
private static $_instance;
private $directory = [];
function __construct() { }
// singleton
public static function instance() {
if (!(self::$_instance instanceof self))
self::$_instance = new self;
return self::$_instance;
}
// reject clone
public function __clone() {
trigger_error('Clone is not allow', E_USER_ERROR);
}
/**
* 读取文件内容
* @param string $path 文件路径
* @return array code与msg字段
*/
public function readFileContent($path) {
if (is_file($path))
$content = file_get_contents($path);
else
$content = '';
if ($content === false)
return ['code' => 0, 'msg' => '获取内容失败'];
else
return ['code' => 1, 'msg' => $content];
}
/**
* 写入文件内容
* @param string $path 文件路径
* @param string $content 文章内容
* @return array code与msg字段
*/
public function writeFileContent($path, $content) {
$flag = 0;
$msg = '保存失败';
$baseDir = dirname($path);
if (!is_dir($baseDir))
mkdir($baseDir);
if (!is_file($path))
touch($path);
$flag = file_put_contents($path, $content);
$flag && $msg = '保存成功' && $flag = 1;
return ['code' => $flag, 'msg' =>$msg];
}
/**
* 检查路径是否存在,
* 存在则返回文件存在,请重新输入,
* 不存在则虚拟返回目录与文件
* @param string $path 文件路径
* @param string $directory 目录,可能为空
* @return array code与msg字段
*/
public function checkFileOrDirWithPath($path, $directory = '') {
$flag = 0;
$msg = '文件存在,请重新输入';
if (!is_file($path))
$flag = 1;
if ($flag) {
$filename = pathinfo($path, PATHINFO_FILENAME);
$msg = ['directory' => $directory, 'filename' => $filename];
}
return ['code' => $flag, 'msg' => $msg];
}
/**
* 删除文件
* @param string $path 文件路径
* @return array code与msg字段
*/
public function deleteFileOrDirWithPath($path) {
is_file($path) && unlink($path);
$files = scandir(dirname($path));
$flag = 0;
$msg = '删除失败';
if ( count($files) === 2 )
$flag = $this->_delDir(dirname($path));
$flag && $msg = '删除成功';
return ['code' => $flag, 'msg' => $msg];
}
// 删除文件夹,如果文件夹内有文件则先删除文件
private function _delDir($dir) {
$dh = opendir($dir);
while ($file = readdir($dh)) {
if ($file != "." && $file != "..") {
$fullPath = $dir . DIRECTORY_SEPARATOR . $file;
if (!is_dir($fullPath)) {
unlink($fullPath);
} else {
$this->delDir($fullPath);
}
}
}
closedir($dh);
if (rmdir($dir))
return 1;
else
return 0;
}
/**
* 获取目录
* @param string $baseDir base路径
* @param string $type 类型,目录还是节点
* @return mixin 返回指定路径下目录或节点
*/
public function getAllDirectoryOrNode($baseDir, $type = 'directory') {
if ($type === 'directory') {
return $this->_allDir($baseDir);
} elseif ($type === 'node') {
$this->directory = [];
$this->_allNodes($baseDir);
return $this->directory;
} else {
return null;
}
}
private function _allDir($baseDir) {
$files = scandir($baseDir);
$dirs = [];
foreach ($files as $file) {
if ($file === '.' || $file === '..')
continue;
$subPath = $baseDir . DIRECTORY_SEPARATOR . $file;
if (is_dir($subPath))
$dirs[] = $file;
}
return $dirs;
}
private function _allNodes($baseDir, $subDir = '', $ext = 'html') {
$files = scandir($baseDir);
foreach ($files as $file) {
if ($file === '.' || $file === '..')
continue;
$subPath = $baseDir . DIRECTORY_SEPARATOR . $file;
if (is_dir($subPath)) {
$this->directory[$file] = [];
$this->_allNodes($subPath . DIRECTORY_SEPARATOR, $file);
} else if (is_file($subPath) && pathinfo($file, PATHINFO_EXTENSION) === $ext) {
$filename = pathinfo($subPath, PATHINFO_FILENAME);
if (empty($subDir))
$this->directory[] = $filename;
else
$this->directory[$subDir][] = $filename;
}
}
}
}