ファイルを作成しようとしていますが、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();
}
}
保存場所をSystem.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)に変更して修正しました
彼らが同じ権限を必要とするときにそれがうまくいった理由を私に尋ねないでください。
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);
}
Xamarin Androidで書き込みまたは読み取りファイルに対してUnauthorizedAccessExceptionが引き続き発生する場合。それを解決するための記事を書いたところ http://bsubramanyamraju.blogspot.com/2019/12/resolved-unauthorizedaccessexception.html
これはコピーアンドペーストエラーのように見えます。一般的なコードと式を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つの変数を作成するだけです。