Xamarin Forms iOS使用CrossMedia拍照报DirectoryNotFoundException如何解决
异常核心原因
触发System.IO.DirectoryNotFoundException的两个直接原因:
- 代码在调用
CrossMedia.Current.TakePhotoAsync时指定了自定义存储路径(指向沙盒Documents/myapp子目录),但没有提前在文件系统中创建这个不存在的子文件夹,直接对不存在的目录执行文件读写操作就会抛出该异常 - 目标文件名拼接存在bug,最终生成的文件路径末尾出现
..jpg的连续双点格式,iOS文件系统对这类带无效分隔符的路径校验严格,会判定路径不存在。
具体修复方案
- 拍照逻辑执行前,先主动完成目标目录的存在性校验与创建,全程用动态API获取沙盒根路径,不要硬编码带UUID的固定路径——iOS沙盒的UUID部分会在应用升级、系统重置时动态变化,硬编码路径在版本更新后必然失效:
// 动态获取iOS沙盒Documents根路径 var docRootPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var targetStoreDir = Path.Combine(docRootPath, "myapp"); // 目录不存在时主动创建,避免读写时找不到路径 if (!Directory.Exists(targetStoreDir)) { Directory.CreateDirectory(targetStoreDir); } - 修正文件名拼接逻辑:排查生成文件名的代码,确保最终拼接的文件名不会出现连续句点,比如在拼时间戳、唯一标识时增加非空校验,避免空值参与拼接导致出现
前缀..后缀的错误格式:// 正确的文件名生成逻辑,避免空值导致的双点问题 var uniqueId = Guid.NewGuid().ToString("N"); var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds().ToString(); var targetFileName = $"{uniqueId}_{timestamp}.jpg"; - 配置CrossMedia的存储参数时,直接传入刚才创建好的
targetStoreDir完整路径,不要手动在路径末尾拼接斜杠、点号等多余字符,避免插件内部二次拼路径时出现格式异常:var mediaOptions = new StoreOptions { Directory = targetStoreDir, // 其他拍照配置项 }; using (var file = await CrossMedia.Current.TakePhotoAsync(mediaOptions)) { // 后续业务处理逻辑 } - 兜底检查iOS项目的权限配置:确认Info.plist中已配置
NSCameraUsageDescription(相机权限)、NSPhotoLibraryAddUsageDescription(相册写入权限)的描述项,iOS14及以上系统对沙盒目录的写入权限校验更严格,权限描述缺失时,应用在沙盒内创建子目录的操作会被系统直接拦截,不会弹出权限申请提示,最终只会返回目录不存在的异常。 - 排查插件版本:如果上述步骤排查完成仍频繁出现路径拼接异常,可检查引用的CrossMedia插件版本,低于1.7.0的旧版本在iOS上存在文件名拼接时多追加句点的已知bug,升级到最新稳定版即可修复。
内容的提问来源于stack exchange,提问作者SoftDev
相关产品推荐
相关产品推荐

