You need to enable JavaScript to run this app. Xamarin Forms iOS使用CrossMedia拍照报DirectoryNotFoundException如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 13:45:08