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包:
- 先在
pubspec.yaml里添加依赖:
dependencies: path: ^1.8.3
- 实现匹配逻辑:
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
相关产品推荐
相关产品推荐

