适配Win32与POSIX系统的文件/目录路径校验函数故障排查求助
路径校验函数优化方案
现有代码核心问题
- 运算符优先级错误:
containsRestrictedCharacters的判断逻辑未给三目运算加括号,实际执行逻辑为(RESTRICTED.test(suspect) || process.platform == "win32") ? Windows校验 : POSIX校验,完全不符合预期 - 非法字符规则错误:
- 把系统合法路径分隔符(POSIX的
/、Windows的\)判定为非法字符 - 全局匹配Windows的冒号,忽略了盘符位置(如
C:\)的冒号是合法的 - 额外拦截了大量系统允许的字符(如空格、
#、%等),不符合“仅校验系统可识别”的需求 - 正则加了
g修饰符,多次调用test会因为lastIndex偏移导致结果异常
- 把系统合法路径分隔符(POSIX的
- 相对路径开头规则错误:直接以文件名开头的路径(如
this/is/a/path)属于合法相对路径,不需要强制以./或../开头,原有校验逻辑直接拦截了这类合法路径
优化后实现
import * as path from "path"; // 操作系统原生禁止的字符规则 const WINDOWS_INVALID_CHAR = /[<>:"/\\|?*\0]/; // POSIX系统仅禁止 / 和空字符 const POSIX_INVALID_CHAR = /[\/\0]/; // Windows盘符合法前缀规则 const WINDOWS_DRIVE_REG = /^[a-zA-Z]:\\/; const isValid = (suspect: string): boolean => { // 空字符串直接判定非法 if (!suspect) return false; let hasInvalidChar: boolean; if (process.platform === "win32") { // 先去除合法的盘符前缀,再校验剩余字符 const pathWithoutDrive = suspect.replace(WINDOWS_DRIVE_REG, ""); hasInvalidChar = WINDOWS_INVALID_CHAR.test(pathWithoutDrive); } else { hasInvalidChar = POSIX_INVALID_CHAR.test(suspect); } if (hasInvalidChar) { console.log("Has invalid character on", process.platform); return false; } // 无需额外校验开头:path.isAbsolute已经可以正确识别合法绝对路径,非绝对路径默认是合法相对路径格式 console.log("Path format is valid"); return true; } // 测试用例 const valid = isValid("this/is/a/valid/file/path"); console.log(valid ? "Path is valid" : "Path is invalid."); // 输出 true
可选扩展
如果业务需要额外拦截特殊字符,可以在系统规则之外单独加自定义校验规则,例如:
// 业务自定义禁止的字符 const CUSTOM_INVALID_CHAR = /[\[\]#%&{}<>*?\s$!'"@|‘“+^`]/; // 在校验系统规则后加判断 if (CUSTOM_INVALID_CHAR.test(suspect)) { console.log("Contains business restricted characters"); return false; }
内容的提问来源于stack exchange,提问作者Patrick Lumenus
相关产品推荐
相关产品推荐

