C# 如何将文件从独立存储复制到下载文件夹?

C# 如何将文件从独立存储复制到下载文件夹?,c#,xamarin,xamarin.forms,xamarin.android,file-copying,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(

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

当前我的数据库存储在:

/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
,但运气不好

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

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

您可以通过自己操作获得所需的运行时权限:

或者通过第三方插件,如詹姆斯·蒙特马诺的
PermissionsPlugin

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

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);
}
public void Handle_按钮(对象发送方,System.EventArgs e)
{
var fileName=“someFile.txt”;
使用(var stream=File.Create(Path.Combine(FileSystem.CacheDirectory,fileName)))
{
//只是创建一个要复制的虚拟文件(在缓存目录中使用Xamarin.Essentials)
}
var downloadPath=DependencyService.Get().Get();
File.Copy(Path.Combine(FileSystem.CacheDirectory,fileName),downloadPath);
}

您不能只写入下载文件夹。您可以使用DownloadManager将文件保存到下载文件夹。您需要外部存储权限才能写入“下载”,一旦你有了它,你就可以使用
Android.OS.Environment.ExternalStorageDirectory
来获取下载文件夹的路径,并使用标准的.Net
File.Copy
api…那么“Assets”文件夹中的文件呢?我想尼克想说的是“/data/user/0/com.companyname.appname/files/Databases/MyDatabase.db”无法识别。虚拟文件工作正常,因为它当前处于打开状态。打开一个.pdf文件,然后将其复制到下载目录,可以吗?