.NET MAUI iOS模拟器访问文件时触发DirectoryNotFoundException
解决复制到本地存储后无法访问文件的问题
问题分析
从错误路径能明显看出,代码尝试访问的路径是应用Bundle目录与带"File: "前缀的实际文件路径的错误拼接。实际存在的有效路径是错误信息中"File: "之后的部分,但SelectedChecklistItem.AttachmentFilePath存储的是带"File: "前缀的无效格式路径,导致File.ReadAllBytesAsync将其视为相对路径,最终找不到目标文件。
错误根源
- 在iOS平台下,
FileResult.FullPath返回的是URI格式路径(如File:///xxx),而非纯本地文件路径,直接使用会引入"File: "前缀干扰路径解析。 - 复制文件完成后,可能错误地将
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
相关产品推荐
相关产品推荐

