You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配Win32与POSIX系统的文件/目录路径校验函数故障排查求助

路径校验函数优化方案

现有代码核心问题

  • 运算符优先级错误:containsRestrictedCharacters的判断逻辑未给三目运算加括号,实际执行逻辑为(RESTRICTED.test(suspect) || process.platform == "win32") ? Windows校验 : POSIX校验,完全不符合预期
  • 非法字符规则错误:
    1. 把系统合法路径分隔符(POSIX的/、Windows的\)判定为非法字符
    2. 全局匹配Windows的冒号,忽略了盘符位置(如C:\)的冒号是合法的
    3. 额外拦截了大量系统允许的字符(如空格、#、%等),不符合“仅校验系统可识别”的需求
    4. 正则加了g修饰符,多次调用test会因为lastIndex偏移导致结果异常
  • 相对路径开头规则错误:直接以文件名开头的路径(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:54:02