* * @brief: 解析从json提取出的文件名 * @return: 正确返回true;否则false,这里不区分各种错误类型 * @notes: 一下根据机器不同可以配置,Golang我没有找到接口可以直接获得以下值,所以手动配置 * Linux下使用getconf PATH_MAX /usr 获取路径长度限制;4096 * getconf NAME_MAX /usr 获取文件名称长度限制;255 * 还有一点是我个人的要求,后缀必须是hdb,就是这么傲娇 * 文件名的限制 : https://en.wikipedia.org/wiki/Filename * 目前搜到
(pathname string)
| 214 | * 目前搜到的文件名限制就是不允许采用"/"和" ",且"-"不能是第一个字符 |
| 215 | */ |
| 216 | func ParserFileName(pathname string) bool { |
| 217 | Length := len(pathname) |
| 218 | |
| 219 | if Length > 4096 { |
| 220 | return false |
| 221 | } |
| 222 | |
| 223 | index1 := -1 // 标示后缀 |
| 224 | index2 := 0 // 标示文件名 |
| 225 | |
| 226 | for i := Length - 1; i >= 0; i-- { |
| 227 | if pathname[i] == '.' { |
| 228 | index1 = i |
| 229 | } else if pathname[i] == '/' { |
| 230 | index2 = i |
| 231 | break |
| 232 | } |
| 233 | } |
| 234 | |
| 235 | // 不存在后缀 |
| 236 | if index1 == -1 { |
| 237 | return false |
| 238 | } |
| 239 | |
| 240 | // 检查后缀 |
| 241 | // a . h d b |
| 242 | // 0 1 2 3 4 |
| 243 | if Length-index1 != 4 { |
| 244 | return false |
| 245 | } else { // 简单有效 不玩花的 |
| 246 | if pathname[index1+1] != 'h' || pathname[index1+2] != 'd' || pathname[index1+3] != 'b' { |
| 247 | return false |
| 248 | } |
| 249 | } |
| 250 | |
| 251 | // 检查文件名; 255见函数注释 |
| 252 | if index1-index2-1 > 255 { |
| 253 | return false |
| 254 | } |
| 255 | |
| 256 | // TODO 目前只检查了最后一个文件名,在这里检测格式是为了早点检测出错误,因为打开这个文件时协议已经开始,会导致读取持久化数据失败;倒也可以使用默认文件 |
| 257 | if pathname[index2+1] == '-' { |
| 258 | return false |
| 259 | } |
| 260 | |
| 261 | // 因为上面的解析过程这里面的数据不可能存在'/',只需要检查' '就可以了 |
| 262 | for i := index2 + 1; i < index1; i++ { |
| 263 | if pathname[i] == ' ' { |
| 264 | return false |
| 265 | } |
| 266 | } |
| 267 | |
| 268 | return true |
| 269 | } |
| 270 | |
| 271 | /* |
| 272 | * @brief: 李浩帮忙推出的服务器连接时间间隔函数 |