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 8

2 ответа:

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

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

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

//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 выражениям пути в коде - просто создайте одну переменную со значением пути и повторно используйте ее.