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

fs.existsSync无法匹配通配符文件名,应使用什么方法替代?

问题根因

fs.existsSync 本身不支持通配符语法,你传入的*会被当成文件名的固定字符去查找,自然找不到符合规则的文件,导致测试运行失败。

解决方案

有两种常用的实现方式:

方案1:使用Node.js原生API实现(无需额外依赖)

先读取目标目录下的所有文件,再通过正则匹配筛选符合规则的文件,示例代码如下:

const fs = require('fs');
const path = require('path');

// 封装通配符文件匹配函数
function matchFiles(dir, pattern) {
  const allFiles = fs.readdirSync(dir);
  // 将通配符规则转换为正则
  const regex = new RegExp(`^${pattern.replace(/\*/g, '.*')}$`);
  return allFiles.filter(file => regex.test(file));
}

// 改造后的测试用例
describe('Sitemap', () => {
  it('it should create XML sitemap', () => {
    let language='hindi'
    return sitemapContainer.createSitemap(language).then(() => {
      const matchedFiles = matchFiles('sos', `sos_${language}*.xml`);
      // 可根据需求调整判断条件,比如判断长度是否为3
      expect(matchedFiles.length).to.be.greaterThan(0);
    });       
  })
})

方案2:使用第三方glob包(写法更简洁,支持复杂通配符规则)

glob是专门用于文件路径匹配的工具,完全兼容shell通配符语法:

  1. 先安装依赖:
    npm install glob --save-dev
  2. 改造后的测试用例:
const glob = require('glob');

describe('Sitemap', () => {
  it('it should create XML sitemap', () => {
    let language='hindi'
    return sitemapContainer.createSitemap(language).then(() => {
      // 直接传入带通配符的路径即可返回所有匹配的文件数组
      const matchedFiles = glob.sync(`sos/sos_${language}*.xml`);
      expect(matchedFiles.length).to.be.greaterThan(0);
      // 如果要验证正好生成3个匹配文件,可改为:
      // expect(matchedFiles.length).to.equal(3);
    });       
  })
})
注意事项

如果你的测试场景需要严格校验生成文件的数量,直接判断匹配结果的数组长度即可,比单纯校验文件是否存在更严谨。

内容的提问来源于stack exchange,提问作者Harsh Sarohi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:45:04