我正在尝试将数据库文件从隔离存储区复制到“下载”文件夹(或用户可以访问的任何文件夹)。
当前我的数据库存储在:/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
,但没有运气。
有没有办法复制这样的文件?我需要任何许可吗?
答案 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);
}