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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:25:15