Xamarin保存文件至设备时始终出现路径权限拒绝问题
问题原因及解决方案
核心错误:你传入了文件夹路径而非文件路径
你代码中Android.App.Application.Context.GetExternalFilesDir("").AbsolutePath获取的是应用专属的外部存储文件夹路径,但FileStream构造函数需要的是具体文件的完整路径,直接传入文件夹路径会触发路径访问错误——操作系统不允许你把字节流写入一个文件夹对象。为什么Download Manager可以正常工作?
Download Manager是系统级服务,它在处理下载时会自动处理文件名(要么从请求头解析,要么自动生成唯一文件名),最终是写入到具体文件而非文件夹,所以不会触发这个错误。修正后的代码示例
需要在文件夹路径后拼接具体的文件名,比如:private async void OnDownloadStart(object sender, Android.Webkit.DownloadEventArgs e) { try { var url = e.Url; var url_formatted = url.Split(","); var base64EncodedBytes = System.Convert.FromBase64String(url_formatted[1]); // 获取文件夹路径 var directory = Android.App.Application.Context.GetExternalFilesDir("").AbsolutePath; // 拼接具体文件名,可根据需求自定义 var filePath = Path.Combine(directory, "downloaded_file.dat"); using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, 4096, FileOptions.Asynchronous)) { await fs.WriteAsync(base64EncodedBytes, 0, base64EncodedBytes.Length); } } catch (System.Exception ex) { var message = ex.Message; throw; } }额外建议:使用
using语句自动释放FileStream资源,避免手动Close可能导致的资源泄漏;同时把同步的Write改成异步的WriteAsync,更贴合方法的async修饰符。
内容的提问来源于stack exchange,提问作者Lucas Ribeiro
相关产品推荐
相关产品推荐

