【问题标题】:Xamarin Forms: File was not saved on the android storageXamarin Forms:文件未保存在 Android 存储中
【发布时间】:2022-11-18 11:06:17
【问题描述】:

私有异步任务 DoDownloadFile(ChatMessageListRefDataModel chatMessage) {

        var status = await Permissions.RequestAsync<Permissions.StorageWrite>();

        if(status == PermissionStatus.Granted)
        {
           await HttpRequestHelper.DownloadFile(chatMessage.FileUrl, chatMessage.FileName);
        }

       
    }


public static async Task DownloadFile(string url, string fileName) {

        var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), fileName);

        using (var downloadStream = await client.GetStreamAsync(url))
        {
            using (var memoryStream = new MemoryStream())
            {
                await downloadStream.CopyToAsync(memoryStream);

                using(FileStream file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
                {
                    byte[] bytes = new byte[memoryStream.Length];
                    memoryStream.Read(bytes, 0, (int)memoryStream.Length);
                    file.Write(bytes, 0, bytes.Length);
                    memoryStream.Close();
                }
            }
        }

该代码不会产生任何错误,只是在手机目录中找不到该文件。可能出了什么问题。谢谢。

【问题讨论】:

  • 你认为文件在哪里应该被写到?

标签: c# xamarin.forms xamarin.android file-handling


【解决方案1】:

我创建了一个新示例来测试您的代码。遇到和你一样的问题。但是问题只是出现在物理设备上。当我在 andorid 模拟器上运行它时,我可以通过 Android Studio 的模拟器设备文件资源管理器找到该文件。

Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), fileName); 路径似乎被隐藏了。我无法通过设备的文件管理器找到它。

所以可以尝试使用如下代码获取路径,如:

var filename1 = Android.App.Application.Context.GetExternalFilesDir("").AbsolutePath;
var filename = System.IO.Path.Combine(filename1,  "xxx.txt");
using (System.IO.FileStream os = new System.IO.FileStream(filename, System.IO.FileMode.OpenOrCreate)) 
{
}

该文件路径可以通过设备的文件管理器找到。你可以试试看。

【讨论】:

  • 感谢你的回答。我会试试这个。另外我如何在 iOS 中实现它?
  • 对于ios,你仍然可以使用Environment.GetFolderPath,我正在寻找更好的解决方案。 @肯
  • 我刚才测试了路径,即使文件路径在文件管理器中是不可见的,但是文件是存在的。所以你也可以使用Environment.GetFolderPath来保存文件。如果要使用文件管理器可见的路径。需要使用依赖服务调用android api获取路径。对于 ios ,您仍然可以使用 Environment.GetFolderPath。 @肯
  • 谢谢你。我想使用文件管理器可见的路径,并知道如何使用 android 的依赖服务。
  • 你可以查看official document about the dependency service,如果还有问题。我会为你做一个样品。 @肯
猜你喜欢
  • 2017-10-11
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多