【问题标题】:How can I copy a file from the isolated storage to the Downloads folder?如何将文件从隔离存储复制到“下载”文件夹?
【发布时间】:2019-11-14 10:40:04
【问题描述】:

我正在尝试将我的数据库文件从隔离存储复制到下载文件夹(或用户可以访问的任何文件夹)。

目前我的数据库存储在:

/data/user/0/com.companyname.appname/files/Databases/MyDatabase.db

我尝试使用此代码:

public string GetCustomFilePath(string folder, string filename)
{
    var docFolder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
    var libFolder = Path.Combine(docFolder, folder);

    if (!Directory.Exists(libFolder))
        Directory.CreateDirectory(libFolder);

    return Path.Combine(libFolder, filename);
}


var bas = GetDatabaseFilePath("MyDatabase.db");
var des = Path.Combine(Android.OS.Environment.DirectoryDownloads, "MyDatabase.db");
File.Copy(bas, des);

Android.OS.Environment.DirectoryDownloads 属性返回路径 Download,即下载文件夹的名称。
但是File.Copy() 抛出一个异常告诉

System.IO.DirectoryNotFoundException:找不到目标目录: 下载。

我之前尝试过像这样使用斜线:/Download/MyDatabase.db,但没有运气。

有没有办法复制这样的文件?我需要任何许可吗?

【问题讨论】:

  • 您不能只写入下载文件夹。您可以使用 DownloadManager 将文件保存到 Downloads 文件夹
  • 您需要外部存储权限才能写入“下载”,一旦获得,您可以使用Android.OS.Environment.ExternalStorageDirectory获取下载文件夹的路径并使用标准.Net File.Copy api ...

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


【解决方案1】:

1st) 是的,您确实需要写入外部存储的权限。

你可以自己动手获取所需的运行时权限:

或者通过第 3 方插件,例如 James Montemagno 的 PermissionsPlugin

2nd)一旦您的用户接受可以写入外部存储,您可以使用:

Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, Android.OS.Environment.DirectoryDownloads

获取设备公共下载文件夹的路径,即使用表单的依赖服务:

public interface IDownloadPath
{
    string Get(); 
}

public class DownloadPath_Android : IDownloadPath
{
    public string Get()
    {
        return Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, Android.OS.Environment.DirectoryDownloads);
    }
}

你最终会得到类似的东西:

public void Handle_Button(object sender, System.EventArgs e)
{
    var fileName = "someFile.txt";
    using (var stream = File.Create(Path.Combine(FileSystem.CacheDirectory, fileName)))
    {
       // just creating a dummy file to copy (in the cache dir using Xamarin.Essentials
    }


    var downloadPath = DependencyService.Get<IDownloadPath>().Get();
    File.Copy(Path.Combine(FileSystem.CacheDirectory, fileName), downloadPath);
}

【讨论】:

  • “资产”文件夹中的文件怎么样?我认为 Nicke 想说的是“/data/user/0/com.companyname.appname/files/Databases/MyDatabase.db”无法识别。虚拟文件工作正常,因为它当前处于打开状态。例如打开一个 .pdf 文件,然后将其复制到下载目录中,你可以这样做吗?
猜你喜欢
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 1970-01-01
  • 1970-01-01
  • 2022-06-20
  • 2021-04-15
相关资源
最近更新 更多