在Xamarin.Forms中,如何将文件从隔离存储复制到“下载”文件夹?

时间:2019-07-03 17:21:22

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

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

当前我的数据库存储在:/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: Destination directory not found: Download

我以前尝试过使用斜杠:/Download/MyDatabase.db,但没有运气。

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

1 个答案:

答案 0 :(得分:1)

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

您可以自己获得所需的运行时间许可:

或者通过第三方插件,例如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);
}