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

.NET MAUI iOS模拟器访问文件时触发DirectoryNotFoundException

解决复制到本地存储后无法访问文件的问题

问题分析

从错误路径能明显看出,代码尝试访问的路径是应用Bundle目录与带"File: "前缀的实际文件路径的错误拼接。实际存在的有效路径是错误信息中"File: "之后的部分,但SelectedChecklistItem.AttachmentFilePath存储的是带"File: "前缀的无效格式路径,导致File.ReadAllBytesAsync将其视为相对路径,最终找不到目标文件。

错误根源

  1. 在iOS平台下,FileResult.FullPath返回的是URI格式路径(如File:///xxx),而非纯本地文件路径,直接使用会引入"File: "前缀干扰路径解析。
  2. 复制文件完成后,可能错误地将result.FullPath(而非生成的attachmentFilePath)赋值给了SelectedChecklistItem.AttachmentFilePath。

解决方案

1. 修正FileResult路径格式

将FileResult.FullPath转换为标准本地文件路径,消除URI格式的影响。

2. 确保赋值正确的本地路径

复制完成后,将生成的attachmentFilePath(而非原始result.FullPath)赋值给SelectedChecklistItem.AttachmentFilePath。

3. 增加路径验证

读取文件前打印路径,确认格式是否正确,方便排查问题。

修改后的代码

复制文件方法

private async Task CopyToLocalAppStorage(string filePrefix, FileResult result)
{
    if (result != null)
    {
        // 把URI格式路径转换为本地文件路径
        string localFilePath = new Uri(result.FullPath).LocalPath;
        
        var attPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
        var fileExt = System.IO.Path.GetExtension(localFilePath);

        attachmentFilePath = Path.Combine(attPath, $"{filePrefix}{DateTime.UtcNow.ToString("yyyyMMddHHmmss")}{fileExt}");

        using (FileStream SourceStream = File.Open(localFilePath, FileMode.Open))
        {
            using (FileStream DestinationStream = File.Create(attachmentFilePath))
            {
                await SourceStream.CopyToAsync(DestinationStream);
            }
        }
        
        // 将正确的本地路径赋值给SelectedChecklistItem
        SelectedChecklistItem.AttachmentFilePath = attachmentFilePath;
    }
}

读取文件方法

private async Task SaveAttachment()
{
    if (SelectedChecklistItem?.AttachmentFilePath != null)
    {
        try
        {
            // 打印路径验证格式是否正确
            Debug.WriteLine($"待读取文件路径: {SelectedChecklistItem.AttachmentFilePath}");
            
            byte[] baContent = await File.ReadAllBytesAsync(SelectedChecklistItem.AttachmentFilePath);
            await _mySvc.SaveAttachment(baContent);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 02:23:16