Xamarin: Android: Система.UnauthorizedAccessException: доступ к пути запрещен

поэтому я пытаюсь создать файл, и я получаю Система.UnauthorizedAccessException: доступ к пути "/DownloadJitters" запрещен. Я не уверен, что это вещь разрешений (я пробовал писать на внешнее хранилище, но это не сработало) или что-то еще. Также я пытаюсь найти хорошее место для записи этих файлов, так как я хотел бы, чтобы их было нелегко найти. Есть идеи? Вот код :

public void favouriteList(MainActivity av, Ordering o, string favouriteName, string totalCost, JittersListView jlv)
    {
        //Checks Directory exists
        if (File.Exists(Android.OS.Environment.DirectoryDownloads + "/Jitters/FavouritesListAdded.txt") == false)
        {
            Directory.CreateDirectory(Android.OS.Environment.DirectoryDownloads + "Jitters/FavouriteList/");
            File.Create(Android.OS.Environment.DirectoryDownloads + "/Jitters/FavouritesListAdded.txt");
        }

        if (File.Exists(Android.OS.Environment.DirectoryDownloads + "Jitters/FavouriteList/" + favouriteName + ".txt") == false)
        {
            var fav = File.Create(Android.OS.Environment.DirectoryDownloads + "Jitters/FavouriteList/" + favouriteName + ".txt");
            fav.Close();
            string file = Android.OS.Environment.DirectoryDownloads + "Jitters/FavouriteList/" + favouriteName + ".txt";
            string added = null;
            int current = 0;
            while (true)
            {
                if (current < jlv.Count)
                {
                    JittersListItem jli = jlv[current];
                    added += jli.Top + "|" + jli.Bottom + "|" + jli.itemPic + "|" + jli.itemDes + System.Environment.NewLine;
                    current++;
                }
                else
                {
                    break;
                }
            }
            File.AppendAllText(file, favouriteName + "|" + totalCost + added);
        }
        else
        {
            new AlertDialog.Builder(av)
                    .SetMessage("Please use a different name, this one has been taken.")
                    .Show();
        }
    }

2 ответов


Ok я исправил это, изменив место сохранения на Система.Окружающая среда.GetFolderPath (System.Окружающая среда.SpecialFolder.Личное)

Не спрашивайте меня, почему это сработало, когда им нужны те же разрешения, но это так.


это выглядит как скопировать и вставить ошибка - вы должны научиться рефакторинг общий код и выражений в одно значение и использовать его.

//Checks Directory exists
if (File.Exists(Android.OS.Environment.DirectoryDownloads + "/Jitters/FavouritesListAdded.txt") == false)
{
    Directory.CreateDirectory(Android.OS.Environment.DirectoryDownloads + "Jitters/FavouriteList/");
    File.Create(Android.OS.Environment.DirectoryDownloads + "/Jitters/FavouritesListAdded.txt");
}

предположим Android.OS.Environment.DirectoryDownloads имеет значение /Downloads. Теперь пройдите код строка за строкой (вы действительно должны сделать это с помощью отладчика):

File.Exists(Android.OS.Environment.DirectoryDownloads + "/Jitters/FavouritesListAdded.txt")

значение параметра здесь будет "/Downloads/Jitters/FavouritesListAdded.txt" - OK

Directory.CreateDirectory(Android.OS.Environment.DirectoryDownloads + "Jitters/FavouriteList/");

здесь нет ведущей косой черты в строке литерала, поэтому значение будет:/DownloadsJitters/FavouriteList - Я предполагаю, что вы наверное, имел в виду /Downloads/Jitters/FavouriteList.

вместо того, чтобы убедиться, что косые черты добавляются ко всем 6 выражениям пути в коде-просто создайте одну переменную со значением пути и повторно.