В Xamarin.Forms, как я могу скопировать файл из изолированного хранилища в папку «Загрузки»? - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь скопировать файл своей базы данных из изолированного хранилища в папку «Загрузка» (или любую другую папку, к которой пользователь имеет доступ).

В настоящее время моя база данных хранится в: /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 Ответ

1 голос
/ 03 июля 2019

1-й) Да, вам нужны разрешения для записи во внешнее хранилище.

Вы можете получить необходимое разрешение на время выполнения, выполнив это самостоятельно:

Или через сторонний плагин, такой как PermissionsPlugin

2nd) Джеймса Монтемагно) Как только ваш пользователь примет это,для записи во внешнее хранилище можно использовать:

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

Чтобы получить путь к общедоступной папке загрузки устройства, т. е. с помощью службы зависимостей Forms:

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);
}
...