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

Dart中如何在未知目录路径子串时检查目录是否存在?

解决Dart中查找含未知子串的路径是否存在的问题

首先得确认下:你示例里的路径看起来更像一个文件路径,不过不管是找文件还是目录,核心思路都是一致的——先定位到已知的父目录(这里就是preview目录),再遍历该目录下的内容,通过匹配规则找到符合条件的项。

下面给你两种实用的实现方案:

方法一:用字符串首尾匹配(标准库实现,无需额外依赖)

这种方式直接用Dart自带的dart:io就能搞定,适合已知路径首尾固定的场景:

import 'dart:io';

Future<bool> checkTargetExists() async {
  // 先确定已知的父目录
  final parentDir = Directory('preview');
  
  // 先校验父目录是否存在,避免后续遍历报错
  if (!await parentDir.exists()) {
    return false;
  }
  
  // 定义路径中已知的前缀和后缀
  const fixedPrefix = '1552146038702.jpg.';
  const fixedSuffix = '.test.jpg';
  
  // 遍历父目录下的所有文件/目录
  await for (final entity in parentDir.list()) {
    // 提取当前项的文件名/目录名
    final basename = entity.path.split(Platform.pathSeparator).last;
    // 匹配首尾固定部分
    if (basename.startsWith(fixedPrefix) && basename.endsWith(fixedSuffix)) {
      // 找到符合条件的项,直接返回存在
      return true;
    }
  }
  
  // 遍历完没找到,返回不存在
  return false;
}

方法二:用通配符匹配(借助官方path包,更灵活)

如果你的未知部分有更复杂的匹配需求,比如想匹配任意字符或者特定规则,可以用通配符*来简化逻辑,这时候需要用到Dart官方的path包:

  1. 先在pubspec.yaml里添加依赖:
dependencies:
  path: ^1.8.3
  1. 实现匹配逻辑:
import 'dart:io';
import 'package:path/path.dart' as path;

Future<bool> checkTargetExistsWithWildcard() async {
  final parentDir = Directory('preview');
  
  if (!await parentDir.exists()) {
    return false;
  }
  
  // 定义通配符匹配模式:前缀 + 任意字符 + 后缀
  final matchPattern = path.join('preview', '1552146038702.jpg.*.test.jpg');
  
  // 遍历目录并匹配通配符规则
  await for (final entity in parentDir.list()) {
    if (path.match(entity.path, matchPattern)) {
      return true;
    }
  }
  
  return false;
}

额外提示

  • 如果你的目标是目录而非文件,只需在遍历判断时加上if (entity is Directory)再做匹配即可;
  • 要是preview目录下文件极多,遍历可能稍慢,记得保持list方法的recursive参数为false(默认就是),只遍历当前目录;
  • 若你知道未知部分的字符规则(比如仅包含数字和横杠),可以把匹配换成正则表达式,比如RegExp(r'^1552146038702.jpg\.[\d\-]+\.html\.test.jpg$'),匹配会更精准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:08:06