import 'package:path/path.dart' as path; class SCPathUtils { /// 判断路径类型 static PathType getPathType(String uri) { if (uri.isEmpty) return PathType.unknown; // 1. 检查网络地址 if (_nt(uri)) return PathType.network; // 2. 检查 Asset 路径 if (_as(uri)) return PathType.asset; // 3. 检查文件路径 if (_fl(uri)) return PathType.file; return PathType.unknown; } // 检查是否是网络地址 static bool _nt(String uri) { final uriPattern = RegExp( r'^(https?|ftp):\/\/' // 协议 r'([\w\-]+(\.[\w\-]+)+)' // 域名 r'(:\d+)?' // 端口 r'(\/[^\s]*)?$', // 路径 caseSensitive: false, ); return uriPattern.hasMatch(uri) || uri.startsWith('http'); } // 检查是否是 Asset 路径 static bool _as(String uri) { // 排除包含特殊字符的情况 if (uri.contains('://') || uri.contains('\\') || path.isAbsolute(uri)) { return false; } // 常见的 asset 路径特征 final isDirectAsset = uri.startsWith('assets/') || uri.startsWith('sc_images/') || uri.startsWith('videos/'); // 检查文件扩展名 final ext = path.extension(uri).toLowerCase(); final isSupportedAsset = [ '.png', '.jpg', '.jpeg', '.gif', '.mp4', '.vap', '.svga', ].contains(ext); return isDirectAsset && isSupportedAsset; } // 检查是否是文件路径 static bool _fl(String uri) { // 检查文件 URI 格式 if (uri.startsWith('file://')) return true; // 检查绝对路径 if (path.isAbsolute(uri)) return true; // 检查 Windows 路径 if (uri.contains(':\\') || uri.contains(':/')) return true; // 检查常见文件扩展名 final ext = path.extension(uri).toLowerCase(); return [ '.mp4', '.mov', '.avi', '.svga', '.png', '.jpg', '.txt', '.pdf', ].contains(ext); } /// 获取路径的文件名(无扩展名) static String getFileNameWithoutExtension(String filePath) { return path.basenameWithoutExtension(filePath); } /// 获取路径的文件扩展名 static String getFileExtension(String filePath) { return path.extension(filePath).toLowerCase(); } /// 从网络地址中提取文件名 static String getFileNameFromUrl(String url) { try { final uri = Uri.parse(url); return path.basename(uri.path); } catch (e) { return 'unknown_file'; } } static String getFileType(String filePath) { String extension = path.extension(filePath).toLowerCase(); // 图片格式 final imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp']; // 视频格式 final videoExtensions = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv']; if (imageExtensions.contains(extension)) { return 'image'; } else if (videoExtensions.contains(extension)) { return 'video_pic'; } else { return 'unknown'; } } static bool fileTypeIsPicAndMP4(String filePath) { String extension = path.extension(filePath).toLowerCase(); // 图片格式 final imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp']; // 视频格式 final videoExtensions = ['.mp4']; if (imageExtensions.contains(extension) || videoExtensions.contains(extension)) { return true; } return false; } static bool fileTypeIsPic(String filePath) { String extension = path.extension(filePath).toLowerCase(); // 图片格式 // final imageExtensions = ['.jpg', '.jpeg', '.png', '.bmp', '.webp']; final imageExtensions = ['.jpg', '.jpeg', '.png']; if (imageExtensions.contains(extension)) { return true; } return false; } static bool fileTypeIsPic2(String filePath) { String extension = path.extension(filePath).toLowerCase(); // 图片格式 final imageExtensions = ['.jpg', '.jpeg', '.png', '.bmp', '.webp']; if (imageExtensions.contains(extension)) { return true; } return false; } } enum PathType { asset, // 资源文件 (assets/) file, // 本地文件路径 network, // 网络地址 unknown, // 未知类型 }