web-dev-qa-db-ja.com

Xamarin:Android:System.UnauthorizedAccessException:パスへのアクセスが拒否されました

ファイルを作成しようとしていますが、System.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();
        }
    }
13
Euan Hollidge

保存場所をSystem.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)に変更して修正しました

彼らが同じ権限を必要とするときにそれがうまくいった理由を私に尋ねないでください。

11
Euan Hollidge

Android 6.0(API 23)なので、権限も手動で要求する必要があるため、Xamarin.AndroidプロジェクトのMainActivity.csに次のコードを追加します。

        if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage) != (int)Permission.Granted)
        {
            ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.WriteExternalStorage }, 0);
        }

        if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) != (int)Permission.Granted)
        {
            ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadExternalStorage }, 0);
        }
9
Led Machine

Xamarin Androidで書き込みまたは読み取りファイルに対してUnauthorizedAccessExceptionが引き続き発生する場合。それを解決するための記事を書いたところ http://bsubramanyamraju.blogspot.com/2019/12/resolved-unauthorizedaccessexception.html

0

これはコピーアンドペーストエラーのように見えます。一般的なコードと式を1つの値にリファクタリングして再利用する方法を学ぶ必要があります。

//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であるとしましょう。次に、コードを1行ずつ実行します(実際にはデバッガーでこれを行う必要があります)。

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つのパス式すべてに追加されることを確認するのではなく、パス値およびそれを再利用するで1つの変数を作成するだけです。

0
adelphus